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_directorieslink_directories 这样的目录函数。它们是已有十年历史的做事方式。它们脆弱、容易出错,并且有你不想让我解释的奇怪行为。使用 target_* 函数。