【问题标题】:Link issues with cmake/make [duplicate]cmake / make的链接问题[重复]
【发布时间】:2021-03-14 16:51:47
【问题描述】:

我是 cmake/make 的新手,所以我正在尝试使用 include 和 lib 目录以及链接到主文件的库进行简单的编译。

我的目录结构是这样的

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。

但是当我运行 make 时,我收到一个链接器错误

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 在哪里?您不应该链接到库 files,而应该链接到库 targets,尤其是当您自己创建它们时。
  • @AlexReinking 好吧,我正在使用库文件进行测试。所以 add.c 不存在,因为我已经将 add.a 编译到 add.c 中,我想看看是否可以将它与 cmake 链接..
  • 那么您的问题的答案就在这里:stackoverflow.com/a/41909627/2137996
  • 谢谢你回答了我的问题!

标签: c makefile cmake linker


【解决方案1】:

由于您自己将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_* 函数。

【讨论】:

  • 我猜你应该输入 add.c 而不是 acc.c
  • 是的。胖手指。
  • 感谢您的回答。没关系,我是用 add.c 做的,有什么方法可以链接 add.a 而不是告诉它编译 add.c 成 add.a 然后链接?
  • 我希望你保留这个答案,以防有人遇到它并想用源文件而不是已经编译的库文件来做。谢谢!
猜你喜欢
  • 1970-01-01
  • 2022-01-05
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多