使用 cmake 编译带有 v8 库的 C++ 程序

Posted

技术标签:

【中文标题】使用 cmake 编译带有 v8 库的 C++ 程序【英文标题】:Compiling a C++ program with v8 library with cmake 【发布时间】:2017-07-01 09:01:17 【问题描述】:

我一直在使用 v8 C++ 库开发一个项目,我曾经使用 Makefile 编译它,但就我使用 CLion 并且我想调试而言,我不得不使用 CMakeLists.txt文件。

我遇到的问题是 Makefile 正在工作,但 cmake 没有...

这是 Makefile:

NAME    = project

SRC = src/main.cpp

OBJ = $(SRC:.cpp=.o)

CXXFLAGS = -Iv8/include -std=c++11

LIBV8 = -Lv8/out/native/obj.target/third_party/icu/. -Lv8/out/native/obj.target/src/. -Wl,--start-group -lv8_base -lv8_libbase -lv8_external_snapshot -lv8_libplatform -lv8_libsampler -licuuc -licui18n -Wl,--end-group

all: $(NAME)

$(NAME): $(OBJ)
    g++  -pthread -lSDL2 $^ -o $@ $(CXXFLAGS) $(LIBV8) -lrt -ldl

这是我制作的 CMake 版本:

cmake_minimum_required(VERSION 2.8.4)
project(Project CXX)

set(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -std=c++11")

include_directories($CMAKE_SOURCE_DIR/v8/include)
include_directories(/usr/include/SDL2)

set(SDL2_LIBRARY /usr/lib/x86_64-linux-gnu/libSDL2.a)

find_package(Threads)

set(LIBV8
        v8_base
        v8_libbase
        v8_external_snapshot
        v8_libplatform
        v8_libsampler
        icuuc
        icui18n
        rt
        dl
        )
link_directories(
        $CMAKE_SOURCE_DIR/v8/out/native/obj.target/src/
        $CMAKE_SOURCE_DIR/v8/out/native/obj.target/third_party/icu/
        $CMAKE_SOURCE_DIR/v8/build/linux/debian_jessie_amd64-sysroot/usr/lib/x86_64-linux-gnu/
)

file(GLOB_RECURSE SOURCES
        $CMAKE_SOURCE_DIR/src/main.cpp
        )

add_executable(project $SOURCES)
target_link_libraries(project $CMAKE_THREAD_LIBS_INIT $SDL2_LIBRARY $LIBV8)

我认为我已经正确链接了所有必要的库,但是当我使用 CMake 版本进行编译时,我遇到了很多错误(对于我的终端来说它们太多了,所以我只需放一个 sn-p,“ référence indéfinie vers”的意思是“未定义的引用”):

../third_party/icu/source/i18n/choicfmt.cpp:(.text._ZN6icu_5912ChoiceFormatC2EPKdPKaPKNS_13UnicodeStringEi+0x43): référence indéfinie vers « icu_59::MessagePattern::MessagePattern(UErrorCode&) »
/home/xobtah/v8_Build/v8/out/native/obj.target/icui18n/third_party/icu/source/i18n/choicfmt.o: dans la fonction « icu_59::ChoiceFormat::ChoiceFormat(icu_59::ChoiceFormat const&) »:
../third_party/icu/source/i18n/choicfmt.cpp:(.text._ZN6icu_5912ChoiceFormatC2ERKS0_+0x3f): référence indéfinie vers « icu_59::MessagePattern::MessagePattern(icu_59::MessagePattern const&) »
/home/xobtah/v8_Build/v8/out/native/obj.target/icui18n/third_party/icu/source/i18n/choicfmt.o: dans la fonction « icu_59::ChoiceFormat::ChoiceFormat(icu_59::UnicodeString const&, UParseError&, UErrorCode&) »:
../third_party/icu/source/i18n/choicfmt.cpp:(.text._ZN6icu_5912ChoiceFormatC2ERKNS_13UnicodeStringER11UParseErrorR10UErrorCode+0x35): référence indéfinie vers « icu_59::MessagePattern::MessagePattern(UErrorCode&) »
/home/xobtah/v8_Build/v8/out/native/obj.target/icui18n/third_party/icu/source/i18n/choicfmt.o: dans la fonction « icu_59::ChoiceFormat::operator==(icu_59::Format const&) const »:
../third_party/icu/source/i18n/choicfmt.cpp:(.text._ZNK6icu_5912ChoiceFormateqERKNS_6FormatE+0x3a): référence indéfinie vers « icu_59::MessagePattern::operator==(icu_59::MessagePattern const&) const »
/home/xobtah/v8_Build/v8/out/native/obj.target/icui18n/third_party/icu/source/i18n/choicfmt.o: dans la fonction « icu_59::ChoiceFormat::operator=(icu_59::ChoiceFormat const&) »:
../third_party/icu/source/i18n/choicfmt.cpp:(.text._ZN6icu_5912ChoiceFormataSERKS0_+0x39): référence indéfinie vers « icu_59::MessagePattern::operator=(icu_59::MessagePattern const&) »
/home/xobtah/v8_Build/v8/out/native/obj.target/icui18n/third_party/icu/source/i18n/choicfmt.o: dans la fonction « icu_59::ChoiceFormat::~ChoiceFormat() »:
../third_party/icu/source/i18n/choicfmt.cpp:(.text._ZN6icu_5912ChoiceFormatD2Ev+0x13): référence indéfinie vers « icu_59::MessagePattern::~MessagePattern() »
/home/xobtah/v8_Build/v8/out/native/obj.target/icui18n/third_party/icu/source/i18n/choicfmt.o: dans la fonction « icu_59::ChoiceFormat::~ChoiceFormat() »:
../third_party/icu/source/i18n/choicfmt.cpp:(.text._ZN6icu_5912ChoiceFormatD0Ev+0x13): référence indéfinie vers « icu_59::MessagePattern::~MessagePattern() »
/home/xobtah/v8_Build/v8/out/native/obj.target/icui18n/third_party/icu/source/i18n/choicfmt.o: dans la fonction « icu_59::ChoiceFormat::applyPattern(icu_59::UnicodeString const&, UErrorCode&) »:
../third_party/icu/source/i18n/choicfmt.cpp:(.text._ZN6icu_5912ChoiceFormat12applyPatternERKNS_13UnicodeStringER10UErrorCode+0x17): référence indéfinie vers « icu_59::MessagePattern::parseChoiceStyle(icu_59::UnicodeString const&, UParseError*, UErrorCode&) »
/home/xobtah/v8_Build/v8/out/native/obj.target/icui18n/third_party/icu/source/i18n/choicfmt.o: dans la fonction « icu_59::ChoiceFormat::applyPattern(icu_59::UnicodeString const&, UParseError&, UErrorCode&) »:
../third_party/icu/source/i18n/choicfmt.cpp:(.text._ZN6icu_5912ChoiceFormat12applyPatternERKNS_13UnicodeStringER11UParseErrorR10UErrorCode+0x12): référence indéfinie vers « icu_59::MessagePattern::parseChoiceStyle(icu_59::UnicodeString const&, UParseError*, UErrorCode&) »
/home/xobtah/v8_Build/v8/out/native/obj.target/icui18n/third_party/icu/source/i18n/choicfmt.o: dans la fonction « icu_59::ChoiceFormat::format(double, icu_59::UnicodeString&, icu_59::FieldPosition&) const »:
../third_party/icu/source/i18n/choicfmt.cpp:(.text._ZNK6icu_5912ChoiceFormat6formatEdRNS_13UnicodeStringERNS_13FieldPositionE+0x8e): référence indéfinie vers « icu_59::MessagePattern::getNumericValue(icu_59::MessagePattern::Part const&) const »
../third_party/icu/source/i18n/choicfmt.cpp:(.text._ZNK6icu_5912ChoiceFormat6formatEdRNS_13UnicodeStringERNS_13FieldPositionE+0x144): référence indéfinie vers « icu_59::MessageImpl::appendSubMessageWithoutSkipSyntax(icu_59::MessagePattern const&, int, icu_59::UnicodeString&) »
/home/xobtah/v8_Build/v8/out/native/obj.target/icui18n/third_party/icu/source/i18n/choicfmt.o: dans la fonction « icu_59::ChoiceFormat::findSubMessage(icu_59::MessagePattern const&, int, double) »:
../third_party/icu/source/i18n/choicfmt.cpp:(.text._ZN6icu_5912ChoiceFormat14findSubMessageERKNS_14MessagePatternEid+0x6e): référence indéfinie vers « icu_59::MessagePattern::getNumericValue(icu_59::MessagePattern::Part const&) const »
/home/xobtah/v8_Build/v8/out/native/obj.target/icui18n/third_party/icu/source/i18n/choicfmt.o: dans la fonction « icu_59::ChoiceFormat::parseArgument(icu_59::MessagePattern const&, int, icu_59::UnicodeString const&, icu_59::ParsePosition&) »:
../third_party/icu/source/i18n/choicfmt.cpp:(.text._ZN6icu_5912ChoiceFormat13parseArgumentERKNS_14MessagePatternEiRKNS_13UnicodeStringERNS_13ParsePositionE+0x5d): référence indéfinie vers « icu_59::MessagePattern::getNumericValue(icu_59::MessagePattern::Part const&) const »
/home/xobtah/v8_Build/v8/out/native/obj.target/icui18n/third_party/icu/source/i18n/choicfmt.o: dans la fonction « icu_59::ChoiceFormat::clone() const »:
../third_party/icu/source/i18n/choicfmt.cpp:(.text._ZNK6icu_5912ChoiceFormat5cloneEv+0x4d): référence indéfinie vers « icu_59::MessagePattern::MessagePattern(icu_59::MessagePattern const&) »
collect2: error: ld returned 1 exit status
CMakeFiles/project.dir/build.make:95: recipe for target 'project' failed
make[2]: *** [project] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/project.dir/all' failed
make[1]: *** [CMakeFiles/project.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

非常感谢您的关注,我很感激!

编辑:make VERBOSE=1 用于链接:

[ 50%] Linking CXX executable project
/opt/cmake-3.7.1-Linux-x86_64/bin/cmake -E cmake_link_script CMakeFiles/project.dir/link.txt --verbose=1
/usr/bin/c++    -std=c++11   CMakeFiles/project.dir/src/main.cpp.o  -o project  -L/home/xobtah/Project/v8/out/native/obj.target/src  -L/home/xobtah/Project/v8/out/native/obj.target/third_party/icu  -L/home/xobtah/Project/v8/build/linux/debian_jessie_amd64-sysroot/usr/lib/x86_64-linux-gnu -Wl,-rpath,/home/xobtah/Project/v8/out/native/obj.target/src:/home/xobtah/Project/v8/out/native/obj.target/third_party/icu:/home/xobtah/Project/v8/build/linux/debian_jessie_amd64-sysroot/usr/lib/x86_64-linux-gnu -rdynamic -lpthread -Wl,-Bstatic -lSDL2 -Wl,-Bdynamic -lv8_base -lv8_libbase -lv8_external_snapshot -lv8_libplatform -lv8_libsampler -licuuc -licui18n -lrt -ldl

【问题讨论】:

您可以尝试make VERBOSE=1 来查看确切的链接器命令行。 感谢您的回答,我编辑了我的帖子以添加链接器行 【参考方案1】:

您可能需要-Wl,--start-group-Wl,--end-group 在您的target_link_libraries() 中的实际v8 库周围。

如果您的目标是复制 Makefile,则 Makefile“LIBV8”中的库与 CMake“LIBV8”中的库不同。

【讨论】:

非常感谢,在这组库之前和之后添加 -Wl,--start-group 和 -Wl,--end-group 就可以了,我也遇到了 SDL2 库的问题,但我用这个解决了它:brendanwhitfield.wordpress.com/2015/02/26/using-cmake-with-sdl2

以上是关于使用 cmake 编译带有 v8 库的 C++ 程序的主要内容,如果未能解决你的问题,请参考以下文章

Open-Dis的C++版本编译(CMake-gpu 3.21.4)以及SDL2和SDL_net库的配置使用

C++学习(四一一)cmake交叉编译Android curl

使用 Linux g++ 编译带有附加库的 c++ 程序

使用 CMake 仅构建 git 子模块存储库的一部分

是否可以将 cmake 项目链接到子项目?

CMake:检查静态 C++ 库的可用性