我是cmake
新手(在Debian / Sid / Linux / x86-64上)
我在https://github.com/bstarynk/onion上分叉了libonion,以便用Boehm的垃圾收集器自定义malloc
;见this mail thread。
我在其他几个修补文件中成功添加了两个文件onion/src/low_util.c
和onion_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_create
和low_util.h
....)。令人惊讶的是,它们被编译,但似乎没有联系。 我不熟悉cmake
,我不熟悉D.Moreno(libonion
的主要作者)如何组织他的 cmake 文件。
任何线索?
答案 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_executable()
命令。target_link_libraries()
命令链接到该库。在这种情况下,如果onion_dict_*
函数在同一个库中定义,则不包括库中的那些文件。使用add_library或add_executable时,请确保将这些文件添加到列表中。如果函数在项目中但不在同一个库中,请使用target_link_libraries()
命令链接到包含正确文件的库。如果这些命令是在外部库中定义的,那么首先使用find_package()
查找库,然后使用target_link_libraries()
链接到库。
答案 1 :(得分:1)
应用以下补丁以使其链接。与您添加的.c文件生成的符号链接的两个可执行文件将丢失并添加到修补程序中。