如何解决使用CMake包含git SHA-链接器错误
我尝试在编译时将git存储库的HEAD的SHA包含到C ++代码中。为此,我正在关注此answer。以下最小工作示例始终在链接阶段失败。
目录结构
ls
的输出:
build CMakeLists.txt cmake-modules-main gitsha1.cpp.in gitsha1.h main.cpp
程序代码
main.cpp
:
#include <iostream>
#include "gitsha1.h"
int main(int argc,char** argv){
printf("%s\n",git_sha1);
return 0;
}
gitsha1.h
:
extern const char git_sha1[];
gitsha1.cpp.in
:
#define GITSHA_1 "@GIT_SHA1@"
const char git_sha1[] = GITSHA_1;
CMakeLists.txt
:
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake-modules-main")
include(GetGitRevisionDescription)
get_git_head_revision(GIT_REFSPEC GIT_SHA1)
add_definitions("-DGIT_SHA1=${GIT_SHA1}")
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/gitsha1.cpp.in" "${CMAKE_CURRENT_BINARY_DIR}/gitsha1.cpp" @ONLY)
list(APPEND SOURCES "${CMAKE_CURRENT_BINARY_DIR}/gitsha1.cpp" "${CMAKE_CURRENT_BINARY_DIR}/gitsha1.h")
project(VERSIONTEST VERSION 1.0)
set(CMAKE_CXX_STANDARD 11)
#include directories
message("${CMAKE_CURRENT_BINARY_DIR}/gitsha1.h")
include_directories("${CMAKE_CURRENT_BINARY_DIR}")
message("Including cpp file : ${CMAKE_CURRENT_BINARY_DIR}/gitsha1.cpp")
add_executable(versiontest main.cpp)
target_sources(versiontest PUBLIC "${CMAKE_CURRENT_BINARY_DIR}/gitsha1.cpp")
链接错误
以上代码将在生成目录中正确生成文件gitsha1.cpp
,但在链接阶段(undefined reference to 'git_sha1'
)失败。 make命令似乎调用了正确的链接命令:
/usr/bin/c++ CMakeFiles/versiontest.dir/main.cpp.o CMakeFiles/versiontest.dir/gitsha1.cpp.o -o versiontest
但是,调查gitsha1.cpp.o
的内容似乎没有包含git_sha1
的符号(命令objdump -t ./CMakeFiles/versiontest.dir/gitsha1.cpp.o
的输出):
./CMakeFiles/versiontest.dir/gitsha1.cpp.o: file format elf64-x86-64
SYMBOL TABLE:
0000000000000000 l df *ABS* 0000000000000000 gitsha1.cpp
0000000000000000 l d .text 0000000000000000 .text
0000000000000000 l d .data 0000000000000000 .data
0000000000000000 l d .bss 0000000000000000 .bss
0000000000000000 l d .rodata 0000000000000000 .rodata
0000000000000000 l O .rodata 0000000000000029 _ZL8git_sha1
0000000000000000 l d .note.GNU-stack 0000000000000000 .note.GNU-stack
0000000000000000 l d .comment 0000000000000000 .comment
有人知道我可以如何更改CMakeLists.txt
来解决此问题?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。