繁体   English   中英

如何使用cmake将共享库用于静态

[英]How to use shared lib for static with cmake

我是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 / sr c / parsing / file_access.co CMakeFiles / rt.dir / src / parsing / str_tool.co CMakeFiles / rt.dir / src / shadow / shadow.co CMakeFiles / rt.dir / src / main.co -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'的未定义引用

如何解决未定义的参考错误?

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

尝试运行:
make VERBOSE=1

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

我已经解决了问题,库的顺序不正确。

我只是链接我的库之前另一个库。 Etvoilà:)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM