cmake编译但不链接库中的新源文件(libonion)

时间:2014-05-13 14:02:30

标签: linux cmake

我是cmake新手(在Debian / Sid / Linux / x86-64上)

我在https://github.com/bstarynk/onion上分叉了libonion,以便用Boehm的垃圾收集器自定义malloc;见this mail thread

我在其他几个修补文件中成功添加了两个文件onion/src/low_util.conion_src/low_util.h#include - d。

它已编译但未链接。

 set(SOURCES onion.c codecs.c dict.c low_util.c request.c response.c handler.c 
                    log.c sessions.c sessions_mem.c shortcuts.c block.c mime.c url.c ${POLLER_C}
        listen_point.c request_parser.c http.c ${HTTPS_C} websocket.c ${RANDOM_C} ${SQLITE3_C})

后:

 SET(INCLUDES_ONION block.h codecs.h dict.h handler.h http.h https.h listen_point.h low_util.h log.h mime.h onion.h poller.h request.h response.h server.h sessions.h shortcuts.h types.h types_internal.h url.h websocket.h ${SQLITE3_H})
 MESSAGE(STATUS "Found include files ${INCLUDES_ONION}")

但是当我build时,我的文件low_util.c已编译但未链接。

Linking C executable otemplate
CMakeFiles/opack.dir/__/__/src/onion/dict.c.o: In function `onion_dict_new':
dict.c:(.text+0x1bc): undefined reference to `onionlow_calloc'
CMakeFiles/opack.dir/__/__/src/onion/dict.c.o: In function `onion_dict_node_data_free':
dict.c:(.text+0x2ec): undefined reference to `onionlow_free'
CMakeFiles/opack.dir/__/__/src/onion/dict.c.o: In function `onion_dict_node_add':

请注意,libonion是一个库(在C中,提供HTTP服务),我只想添加low_util.c文件(包裹malloc& pthread_create等...让Boehm的GC感到高兴:它用GC_malloc标题调用GC_pthread_createlow_util.h ....)。令人惊讶的是,它们被编译,但似乎没有联系。 我不熟悉cmake ,我不熟悉D.Moreno(libonion的主要作者)如何组织他的 cmake 文件。

任何线索?

2 个答案:

答案 0 :(得分:1)

根据你发布的内容,很难说出什么可能是错的。上面的蛋糕源代码表示变量${SOURCES}等同于onion.c codecs.c dict.c low_util.c ... ${SQLITE3_C},变量${INCLUDE_ONION}等同于block.h codecs.h dict.h ... ${SQLITE3_H}。您没有提供任何目标或这些目标中包含的文件。

可能有用的简要列表:

  • 您在哪里定义顶级库或可执行文件?如果您正在创建库,则需要命令add_library()。如果要创建可执行文件,则需要add_executable()命令。
  • 使用命令target_link_libraries()解决依赖关系。不是将所有源文件放在单个库中,而是在单个目标中将类似的组合在一起(目标由add_ *命令定义),并使用此命令在编译后链接目标。
  • 使用find_package()获取系统中定义但未在项目中定义的任何库。然后,使用target_link_libraries()命令链接到该库。

在这种情况下,如果onion_dict_*函数在同一个库中定义,则不包括库中的那些文件。使用add_library或add_executable时,请确保将这些文件添加到列表中。如果函数在项目中但不在同一个库中,请使用target_link_libraries()命令链接到包含正确文件的库。如果这些命令是在外部库中定义的,那么首先使用find_package()查找库,然后使用target_link_libraries()链接到库。

答案 1 :(得分:1)

应用以下补丁以使其链接。与您添加的.c文件生成的符号链接的两个可执行文件将丢失并添加到修补程序中。

http://pastebin.com/mDMRiUQu