【问题标题】:How to use shared lib for static with cmake如何通过 cmake 将共享库用于静态
【发布时间】:2015-09-06 19:23:56
【问题描述】:

我是 CMake 的初学者,我想用它来编译我的项目。 我有以下 CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
project (rt)

include_directories ("${PROJECT_BINARY_DIR}/src/")
include_directories ("${PROJECT_BINARY_DIR}/src/hook")
include_directories ("${PROJECT_BINARY_DIR}/src/light")
include_directories ("${PROJECT_BINARY_DIR}/src/move")
include_directories ("${PROJECT_BINARY_DIR}/src/object/inter")
include_directories ("${PROJECT_BINARY_DIR}/src/object/normal")
include_directories ("${PROJECT_BINARY_DIR}/src/option")
include_directories ("${PROJECT_BINARY_DIR}/src/parsing")
include_directories ("${PROJECT_BINARY_DIR}/src/ray")
include_directories ("${PROJECT_BINARY_DIR}/src/render")
include_directories ("${PROJECT_BINARY_DIR}/src/shadow")
include_directories ("${PROJECT_BINARY_DIR}/src/utils")
include_directories ("${PROJECT_BINARY_DIR}/lib/minilibx")

file(GLOB hook
    "*.h"
    "*.c"
)

file(GLOB_RECURSE SRC_FILES ${PROJECT_SOURCE_DIR}/src/*.c)

#set (EXTRA_LIBS ${EXTRA_LIBS} ${X11_LIBRARIES} m)

add_executable (rt ${SRC_FILES})
target_link_libraries (rt ${EXTRA_LIBS} X11 Xext m ${PROJECT_BINARY_DIR}/lib/libmlx.a)

但是当我运行make 时,我的静态库minilibx 将无法编译。错误是 X11Xext 库中的所有函数都未定义。

使 VERBOSE=1 结果:

链接 C 可执行文件 rt /usr/bin/cmake -E cmake_link_script CMakeFiles/rt.dir/link.txt --verbose=1 /usr/bin/cc CMakeFiles/rt.dir/src/move/translation.co CMakeFiles/rt.dir/src/move/rotation.co CMakeFiles/rt.dir/src/light/light.co CMakeFiles/rt.dir /src/option/option.co CMakeFiles/rt.dir/src/option/file_option.co CMakeFiles/rt.dir/src/render/render.co CMakeFiles/rt.dir/src/hook/control.co CMakeFiles/rt .dir/src/ray/eye.co CMakeFiles/rt.dir/src/ray/ray.co CMakeFiles/rt.dir/src/utils/my_strlen.co CMakeFiles/rt.dir/src/utils/my_strncpy.co CMakeFiles /rt.dir/src/object/inter/plan.co CMakeFiles/rt.dir/src/object/inter/cone.co CMakeFiles/rt.dir/src/object/inter/cylinder.co CMakeFiles/rt.dir/ src/object/inter/sphere.co CMakeFiles/rt.dir/src/object/inter/tore.co CMakeFiles/rt.dir/src/object/normal/plan.co CMakeFiles/rt.dir/src/object/normal /cone.co CMakeFiles/rt.dir/src/object/normal/cylinder.co CMakeFiles/rt.dir/src/object/normal/sphere.co CMakeFiles/rt.dir/src/parsing/scene.co CMakeFiles/rt .dir/src/parsing/file_access.co CMakeFiles/rt.dir/src/parsing/str_tool.co CMak eFiles/rt.dir/src/shadow/shadow.c.o CMakeFiles/rt.dir/src/main.c.o -o rt -rdynamic -lX11 -lXext -lm lib/libmlx.a

这是一个错误示例:

lib/libmlx.a(mlx_init.o):在函数 mlx_int_deal_shm' 中: mlx_init.c:(.text+0x2a): 未定义对 XShmQueryVersion 的引用 mlx_init.c:(.text+0x104): 未定义对 `XShmPixmapFormat' 的引用

如何解决未定义的引用错误?

【问题讨论】:

    标签: c cmake makefile x11


    【解决方案1】:

    CMake 使用 target_link_libraries 来指定您链接的库。
    在您的情况下,您似乎正在链接正确的库(target_link_libraries (rt ${EXTRA_LIBS} X11 Xext m ${PROJECT_BINARY_DIR}/lib/libmlx.a)),所以我敢打赌它们找不到。

    尝试运行:
    make VERBOSE=1

    这将为您提供 gcc 输出。将它生成的最后几个 gcc 指令粘贴到此处,我们将了解它为什么找不到您的库。

    【讨论】:

      【解决方案2】:

      我已经解决了,libs的顺序不对。

      我只是将我的库链接到另一个库之前。等等 :)

      target_link_libraries (rt ${EXTRA_LIBS} ${PROJECT_BINARY_DIR}/lib/libmlx.a X11 Xext m)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-08
        • 1970-01-01
        • 1970-01-01
        • 2013-10-09
        • 2021-11-21
        • 2023-03-03
        • 1970-01-01
        • 2020-03-02
        相关资源
        最近更新 更多