Почему работает link_libraries (stdc ++ fs), но не -lstdc ++ fs? - PullRequest
0 голосов
/ 16 декабря 2018

Я пытался скомпилировать программу на C ++ 17 в Ubuntu, используя CMake / g ++ 8.1, которая содержала

#include <filesystem>

Когда я использовал это

set(CMAKE_CXX_FLAGS "-lstdc++fs")

, я получил странный компоновщикошибка

undefined reference to `std::filesystem::__cxx11::recursive_directory_iterator::~recursive_directory_iterator()'

Эта ошибка также возникала, когда я пытался вызвать g ++ вручную с флагом -lstdc++fs.

С другой стороны, эта строка работала, как я ожидал

link_libraries(stdc++fs)

Мне любопытно, почему эти две строки дают разные результаты.Использует ли функция link_libraries() какую-то магию, о которой я не знаю?

1 Ответ

0 голосов
/ 16 декабря 2018

Это изменяет флаги компилятора, но не флаги ссылки:

set(CMAKE_CXX_FLAGS "-lstdc++fs")

Это означает, что когда вы компилируете файл, вы добавляете библиотеку, которая не имеет никакого эффекта, а затем при ссылке на созданиеВаш исполняемый файл, вы не получаете этот флаг.

Таким образом, вы должны фактически изменить компоновщик с помощью:

target_link_libraries(target PRIVATE stdc++fs)

вместо link_libraries (который является старымстиль CMake и не подходит для работы с несколькими целями).

target_link_libraries рекомендуется, поскольку он только добавляет библиотеку к target.PRIVATE также указывает, что не следует распространять ссылку для общих библиотек (т.е. зависимые библиотеки не будут ссылаться на stdc++fs).

Вы можете проверить разницу в поведении между ними, выполнив:

VERBOSE=1 make
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...