【问题标题】:CMake, shared library linking failCMake,共享库链接失败
【发布时间】:2017-07-06 11:39:09
【问题描述】:

我目前正在习惯 cmake,我正在尝试编译一个带有 .so 库链接的小项目。

我的项目如下。

/
   CMakeLists.txt
   inc/
       Als.h
   src/
       main.c
       CMakeLists.txt
   lib/
       libals.so
   build/

我正在从构建目录编译:

$ cmake ..
-- DIR: 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/julien/tmp/cmakeTest/build

然后:

$ make
Linking C executable cmakeTest
/usr/bin/ld: ne peut trouver -lals
collect2: error: ld returned 1 exit status
src/CMakeFiles/cmakeTest.dir/build.make:85: recipe for target 'src/cmakeTest' failed
make[2]: *** [src/cmakeTest] Error 1
CMakeFiles/Makefile2:75: recipe for target 'src/CMakeFiles/cmakeTest.dir/all' failed
make[1]: *** [src/CMakeFiles/cmakeTest.dir/all] Error 2
Makefile:76: recipe for target 'all' failed
make: *** [all] Error 2

链接器似乎无法找到 libals.so 文件。

这里是文件/CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)

PROJECT(cmaketest)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3")

INCLUDE_DIRECTORIES(
  inc
)

ADD_SUBDIRECTORY(src)

get_directory_property(OUT_VAR LINK_DIRECTORIES)
message(STATUS "DIR: ${OUT_VAR}")

这里是文件/src/CMakeLists.txt:

PROJECT(cmakeTest)

FILE(
    GLOB
    ${PROJECT_NAME}_Sources
    *.c
)

INCLUDE_DIRECTORIES(
        inc
        inc
)

ADD_EXECUTABLE(
    ${PROJECT_NAME}
    ${${PROJECT_NAME}_Sources}
)

LINK_DIRECTORIES(
    /home/julien/tmp/cmakeTest/lib/
)

TARGET_LINK_LIBRARIES(
    ${PROJECT_NAME}
    als
    pthread
)

也许我错过了什么,但如果我将 /src/CMakeLists.txt 更改为:

PROJECT(cmakeTest)

FILE(
    GLOB
    ${PROJECT_NAME}_Sources
    *.c
)

INCLUDE_DIRECTORIES(
        inc
        inc
)

ADD_EXECUTABLE(
    ${PROJECT_NAME}
    ${${PROJECT_NAME}_Sources}
)

TARGET_LINK_LIBRARIES(
    ${PROJECT_NAME}
    /home/julien/tmp/cmakeTest/lib/libals.so
    pthread
)

编译没问题。有人知道为什么链接器无法找到 libals.so 当我给他一个好的目录路径来查看吗?

LINK_DIRECTORIES 函数似乎不起作用。

【问题讨论】:

  • "编译没问题" - 所以不要添加C和"编译"标签。
  • 我的建议是你 add the library as an imported target,设置它的位置属性 (see example here) 并简单地将其用作普通库(就像你在项目中使用 pthread 库一样)。实际上,它与您的工作 CMakeLists.txt IMO 并没有什么不同,它更像是“cmake-ish”。
  • 另外,您可能应该运行makeVERBOSE=1 以查看cmake 生成的用于构建目标的命令。然后你可以看到它传递给链接器的标志和选项。

标签: cmake shared-libraries dynamic-linking


【解决方案1】:

除了您已经拥有的解决方案以及我在评论中的解决方案之外,您在显示的 CMake 文件中遇到的问题是您调用 CMake 命令的顺序。

From the link_directories command reference:

该命令仅适用于调用后创建的目标

[强调我的]

您只需拨打link_directories之前您拨打add_executable

【讨论】:

  • 这就是问题所在。非常感谢;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 2019-05-26
相关资源
最近更新 更多