【问题标题】:CMake cannot find my library fileCMake 找不到我的库文件
【发布时间】:2014-12-01 02:33:59
【问题描述】:

我想使用 CMake 创建一个简单的静态库Maths,然后链接到该库以创建一个简单的可执行文件Alpha

这是我的目录结构:

/Maths
    /build
        /
    /CMakeLists.txt
    /maths.cpp
    /maths.h
/Alpha
    /build
        /
    /CMakeLists.txt
    /main.cpp

以下是这些文件的内容:

* CMakeLists.txt(用于数学)*

cmake_minimum_required(VERSION 2.6)
project(Maths)
add_library(maths STATIC maths.cpp)

* maths.cpp *

int Double(int x)
{
    int y = x * 2;
    return y;
}

* maths.h *

int Double(int x);

* CMakeLists.txt(用于 Alpha)*

cmake_minimum_required(VERSION 2.8)
project(Alpha)
add_executable(alpha main.cpp ../Maths/maths.h)
target_link_libraries(maths ../Maths/build/libmaths.a)

* main.cpp *

#include <iostream>

#include "maths.h"

using namespace std;

int main()
{
    int x = 5;
    int y = Triple(x);
    cout << "The answer = " << y << endl;
    return 0;
}

所以,我进入目录/Maths/build,然后运行cmake ..。然后,我运行make。这将在目录/Maths/build 中创建库文件libmaths.a

然后,我进入目录/Alpha/build,运行cmake ..。然后,我运行make。但是,这给了我错误消息:

/usr/bin/ld: cannot find -lmaths

为什么make找不到我刚刚创建的库文件?

我还尝试将libmaths.amaths.h 复制到目录/Alpha 中,并将Alpha 的CMakeLists.txt 更改为:

cmake_minimum_required(VERSION 2.8)
project(Alpha)
add_executable(alpha main.cpp maths.h)
target_link_libraries(maths libmaths.a)

但这给出了同样的错误。

【问题讨论】:

    标签: cmake


    【解决方案1】:

    这里的基本问题是libmaths.a 没有放在默认链接器目录之一中。 更大的问题是您首先将libmaths.a 传递给target_link_libraries

    这很糟糕有几个原因,但最明显的是它完全不便携。对于静态库,不同的编译器工具链可能使用与 .a 不同的结尾,因此您将无法在那里构建。此外,如果您将来决定切换到动态链接,这意味着重构您现有的 CMake 脚本。

    正确的解决方案是不要将硬编码的文件名传递给target_link_libraries。您可以采取两条道路来避免这种情况。

    1. 使用查找脚本。本质上,您拨打find_library(MY_MATHLIB maths [...]),然后拨打target_link_libraries(alpha ${MY_MATHLIB})。这将以可移植的方式确定.a 文件的绝对路径并将其传递给链接器。这种方法的最大缺点是.a 文件必须已经存在,find 调用才能成功。因此,如果您想在运行 alpha 的 CMake 之后构建 maths,或者将其构建为 alpha 的一部分,这将不起作用。

    2. 由于这两个库都在您的控制之下,请考虑使用CMake's packaging mechanism。这是迄今为止最方便的构建方法,但不幸的是,它也是最难设置的。如果您愿意花一些时间浏览 CMake 文档并尝试构建,我鼓励您尝试一下,但如果您只是想要快速运行的东西,您可能需要坚持使用选项 1。

    【讨论】:

    • 我在这里也遇到了同样的问题,也刚刚开始cmake。我对 C++ 编程实践一无所知,刚刚入门。你能解释一下你的第一个建议吗?因为我无法理解提供的链接中的内容。如果您能举个例子,我将不胜感激。
    • @Bora find_library 命令只是在磁盘上查找库文件。由于 CMake 知道不同编译器的命名约定,因此您只需给出原始名称(示例中为 maths)而无需任何文件扩展名,CMake 将自动搜索正确的文件。根据您的系统和文件的位置,您可能仍需要提供文件所在位置的其他提示。查看链接的联机帮助页,了解查找规则的完整说明。但到头来其实也不过是在磁盘上搜索一个名字匹配的文件而已。
    【解决方案2】:

    在根目录中使用CMakeLists.txt

    /CMakeLists.txt:

    CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
    PROJECT( MyProject )
    ADD_SUBDIRECTORY( Maths )
    ADD_SUBDIRECTORY( Alpha )
    

    在 Alpha/CMakeLists.txt 中:

    TARGET_LINK_LIBRARIES( alpha maths ) 
    

    在顶级 CMakeLists.txt 上运行 CMake,而不是在各个子目录上运行

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      相关资源
      最近更新 更多