使用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 (将#修改为@)