CMake,共享库链接失败

CMake, shared library linking fail

我目前正在习惯 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 功能似乎不起作用。

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

From the link_directories command reference:

The command will apply only to targets created after it is called.

[强调我的]

您只需在 调用 add_executable.

之前调用 link_directories