我见过类似的问题,但我无法理解该接受的答案。
我的项目结构是这样的
├── CMakeLists.txt
├── main.cpp
└── plugins
├── CMakeLists.txt
├── plugin.cpp
└── plugin.h
CMakeLists.txt
的内容是这样的:
# top-level CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.22)
PROJECT(example)
add_subdirectory(./plugins/)
add_executable(main main.cpp)
target_include_directories(main PUBLIC ./plugins/)
target_link_libraries(main -lplugin)
./plugins/文件夹中的CMakeLists.txt
add_library(plugin SHARED plugin.cpp)
代码是这样的:
// main.cpp
#include <iostream>
#include "plugin.h"
int call() {
using namespace std;
cout << "call\n";
func();
}
int main() {
call();
return 0;
}
// plugins/plugin.cpp
#include <iostream>
void func() {
using namespace std;
cout << "plugin\n";
}
// plugins/plugin.h
void func();
当我编译这个时,我得到了错误
make[2]: *** No rule to make target 'plugins/libplugin.so', needed by 'main'. Stop.
make[1]: *** [CMakeFiles/Makefile2:100: CMakeFiles/main.dir/all] Error 2
make: *** [Makefile:91: all] Error 2
你能告诉我如何做到这一点吗?
如果您将
target_link_libraries
呼叫更改为以下内容:
target_link_libraries(main PUBLIC plugin)
CMake 将:
main
目标到 plugin
目标的依赖关系。main
,使其知道在哪里可以找到 libplugin.so
你必须使用
target_link_libraries(main plugin)
:
target_link_libraries
的文档中所述
target_link_libraries(<target> ... <item>... ...)
每个可能是:
- 库目标名称:生成的链接行将具有与目标关联的可链接库文件的完整路径。如果库文件发生更改,构建系统将具有重新链接的依赖项。 [..]
- 链接标志:以
[..]-
开头的项目名称 此处指定的链接标志将插入到链接命令中
因此库目标添加了对目标的依赖关系,而链接标志则没有。