Link 关于 cmake/make 的问题
Link issues with cmake/make
我是 cmake/make 的新手,所以我正在尝试使用 include 和 lib 目录以及 link 到主文件的库进行简单编译。
我的目录结构是这样的
PROJECTDIRECTORY/
main.c
CMAKELISTS.txt
include/
add.h
lib/
add.a
build/
我的main.c包含
#include <add.h>
int main(void)
{
add(5,10);
return 0;
}
我的add.h包含
int add(int x,int y);
我的 add.a 是我从 add.c 编译的静态库,其中包含实现。
终于在我的 CMakeLists.txt 我有
cmake_minimum_required (VERSION 3.6)
project(addproject)
add_executable(addproject main.c)
include_directories(include)
link_directories(lib)
target_link_libraries(addproject add.a)
然后当我 运行 cmake 。 ,它会正确生成 makefile。
但是当我 运行 制作时,我收到一个 linker 错误
Scanning dependencies of target addproject
[ 50%] Building C object CMakeFiles/addproject.dir/main.c.o
[100%] Linking C executable addproject
ld: library not found for -ladd
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [addproject] Error 1
make[1]: *** [CMakeFiles/addproject.dir/all] Error 2
make: *** [all] Error 2
说明找不到要添加的库?即使我在 cmake 中设置 library_directories..
有人可以帮我解决这个错误吗?
谢谢!
由于您自己将 add.c
编译成 add.a
,因此您应该在 CMake 中使用目标完成所有操作。你没有说 add.c
在哪里,但我假设它在 lib
中。以下是您应该写的内容:
cmake_minimum_required(VERSION 3.19)
project(addproject)
add_library(add lib/add.c)
target_include_directories(add PUBLIC include)
add_executable(addproject main.c)
target_link_libraries(addproject PRIVATE add)
现在 CMake 管理构建的两个部分,它将在链接到 add
时为 addproject
派生正确的编译器标志。请注意,“PUBLIC”属性 传播 给他们的链接对象。因此,因为 addproject
链接到 add
,它将接收 add
.
的包含目录
在新的 CMake 代码中,从不 使用像 include_directories
和 link_directories
这样的目录函数。它们是已有十年历史的做事方式。它们脆弱、容易出错,并且有你不想让我解释的奇怪行为。使用 target_*
函数。
我是 cmake/make 的新手,所以我正在尝试使用 include 和 lib 目录以及 link 到主文件的库进行简单编译。
我的目录结构是这样的
PROJECTDIRECTORY/
main.c
CMAKELISTS.txt
include/
add.h
lib/
add.a
build/
我的main.c包含
#include <add.h>
int main(void)
{
add(5,10);
return 0;
}
我的add.h包含
int add(int x,int y);
我的 add.a 是我从 add.c 编译的静态库,其中包含实现。
终于在我的 CMakeLists.txt 我有
cmake_minimum_required (VERSION 3.6)
project(addproject)
add_executable(addproject main.c)
include_directories(include)
link_directories(lib)
target_link_libraries(addproject add.a)
然后当我 运行 cmake 。 ,它会正确生成 makefile。
但是当我 运行 制作时,我收到一个 linker 错误
Scanning dependencies of target addproject
[ 50%] Building C object CMakeFiles/addproject.dir/main.c.o
[100%] Linking C executable addproject
ld: library not found for -ladd
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [addproject] Error 1
make[1]: *** [CMakeFiles/addproject.dir/all] Error 2
make: *** [all] Error 2
说明找不到要添加的库?即使我在 cmake 中设置 library_directories.. 有人可以帮我解决这个错误吗?
谢谢!
由于您自己将 add.c
编译成 add.a
,因此您应该在 CMake 中使用目标完成所有操作。你没有说 add.c
在哪里,但我假设它在 lib
中。以下是您应该写的内容:
cmake_minimum_required(VERSION 3.19)
project(addproject)
add_library(add lib/add.c)
target_include_directories(add PUBLIC include)
add_executable(addproject main.c)
target_link_libraries(addproject PRIVATE add)
现在 CMake 管理构建的两个部分,它将在链接到 add
时为 addproject
派生正确的编译器标志。请注意,“PUBLIC”属性 传播 给他们的链接对象。因此,因为 addproject
链接到 add
,它将接收 add
.
在新的 CMake 代码中,从不 使用像 include_directories
和 link_directories
这样的目录函数。它们是已有十年历史的做事方式。它们脆弱、容易出错,并且有你不想让我解释的奇怪行为。使用 target_*
函数。