Cmake 未使用“target_link_directory”正确添加目录

Kar*_*rus 0 c++ makefile cmake

我是 Ubuntu,我正在学习 cmake 和 make,只是尝试一个简单的例子。我有两个目录:srcbuild. 在 中src,我有三个文件:main.cppcamera.hppCMakeLists.txt,其中(仅)包含以下文本:

add_executable(test main.cpp)
target_link_directory(/home/karnivaurus/Libraries)
target_link_libraries(test Camera)
Run Code Online (Sandbox Code Playgroud)

在 中/home/karnivaurus/Libraries,我有一个名为 的共享库libCamera.so,我想链接到它。我main.cpp使用这个库中的函数,这些函数在camera.hpp.

现在,在我的build目录中,我运行cmake ../src,然后运行make​​。但是,然后我收到链接器错误,告诉我库中的某些函数存在未定义的引用。如果我搜索 中的所有文件和子目录build,则没有提及libCamera.so.

但是,如果我删除文件target_link_directory中的行CMakeLists.txt,并在指定可执行文件时写入库的完整路径,即target_link_libraries(test /home/karnivaurus/Libraries/libCamera.so),它可以正常编译和链接。

为什么target_link_directory没有按预期工作?

小智 5

这有一天可能会对某人有所帮助。

你应该使用target_link_directories之后add_executable

例子:

add_executable(main main.cpp)

然后

target_link_directories(target PUBLIC|PRIVATE|INTERFACE directory)

所以你的最终结果可能看起来像

add_executable(main main.cpp)

target_link_directories(main INTERFACE /my/libs/dir)
Run Code Online (Sandbox Code Playgroud)

或者

add_executable(main main.cpp)
target_link_directories(main PUBLIC /my/libs/dir)
Run Code Online (Sandbox Code Playgroud)

或者

add_executable(main main.cpp)
target_link_directories(main PRIVATE /my/libs/dir)
Run Code Online (Sandbox Code Playgroud)

不幸的是,CMake 不鼓励这样做,您应该链接您想要的实际库

target_link_libraries (main /my/awesome/lib.so)
Run Code Online (Sandbox Code Playgroud)

还有另一种链接目录的方法。

link_directories(/my/libs/dir)
Run Code Online (Sandbox Code Playgroud)

查看官方文档(https://cmake.org/cmake/help/git-stage/command/target_link_directories.html