通过 cmake 链接到静态库

Posted

技术标签:

【中文标题】通过 cmake 链接到静态库【英文标题】:Link to static library by cmake 【发布时间】:2017-09-13 15:52:08 【问题描述】:

我有一个使用 libnuma 库的 C++ 项目。因为我没有在根系统安装libnuma的权限,所以我必须将它安装在用户的文件夹:/home/khangtg/opt。此文件夹包含 2 个主要文件夹:

文件夹 include 包含:numacompat1.h、numa.h、numaif.h 文件夹 lib 包含:libnuma.a、libnuma.la、libnuma.so、libnuma.so.1、libnuma.so.1.0.0

现在,我有一个文件 .cpp 包含 libnuma 库:

#include <numa.h>

我通过文件 CMakeLists.txt 构建项目,内容如下:

add_library (common Bigraph.cpp AdjList.cpp Vocab.cpp NumaArray.cpp clock.cpp)
set (LINK_LIBS $LINK_LIBS common gflags numa )

add_executable (warplda main.cpp lda.cpp warplda.cpp)
add_executable (format format.cpp)

target_link_libraries (warplda $LINK_LIBS)
target_link_libraries (format $LINK_LIBS)

运行 cmake 命令后,我得到一些错误,“不能包含 numa.h”。

那么,我该如何修复这个错误并通过 cmake 构建项目。非常感谢!

【问题讨论】:

【参考方案1】:

您想将link_directories 设置为包含库的目录。更多可以找到in the cmake docs。这告诉链接器在哪里查找库。

它应该看起来像这样

link_directories(/home/khangtg/opt/lib)

同时添加来自this documentation 的包含目录命令。 这看起来像这样

include_directories(/home/khangtg/opt/include)

【讨论】:

您还需要为标题添加 include_director 这将是 include_directories(/home/khangtg/opt/include)【参考方案2】:

这可能有助于添加到您的 cmake 构建文件中:

include_directories("/home/khangtg/opt/include")

发件人:cmake tutorial

您可能还想将包含更改为:

#include "numa.h"

【讨论】:

它实际上修复了错误包括,但我在这里看到另一个错误:/usr/bin/ld: 找不到 -lnuma。 collect2:错误:ld 返回 1 个退出状态。 make[2]: *** [src/format] 错误 1. make[1]: *** [src/CMakeFiles/format.dir/all] 错误 2. make[1]: *** 等待未完成的工作....

以上是关于通过 cmake 链接到静态库的主要内容,如果未能解决你的问题,请参考以下文章

opencv静态链接库cmake链接顺序问题

使用 cmake 如何静态链接一些库和动态链接其他库?

如何将 TensorFlow Lite 构建为静态库并从单独的(CMake)项目链接到它?

当我链接动态库而不是静态库时,CMake 有效

cmake设置默认静态链接库

在链接静态库之前让 cmake 修改目标文件