【问题标题】:Linking problems with c++ on OS X在 OS X 上使用 c++ 链接问题
【发布时间】:2021-02-17 05:31:24
【问题描述】:

我的问题是,我想在 OS X 上编译一些 c++ 代码。在 Linux 上这工作得很好,但如果我想在 mac 上编译它,我会收到以下错误:

Undefined symbols for architecture x86_64:
  "test2::printHelloWorld()", referenced from:
      test::printHelloWorld() in test.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我有三个相互依赖的小文件和一个 CMAKE:

//main.cpp
#include "test.h"

int main() {
  test t;
  t.printHelloWorld(); //<- this calls printHelloWorld from test.h
  return 0;
}
//test.h
class test {
 public:
  void printHelloWorld(); //<- this calls printHelloWorld from test2.h
};
//test.cpp
#include test2.h

test::printHelloWorld(){
  test2 t;
  t.printHelloWorld();
}
//test2.h
class test2 {
 public:
  void printHelloWorld();
};
//test2.cpp
#include <iostream>

test2::printHelloWorld(){
  std::cout << "Hello World\n";
}
//CMAKE
cmake_minimum_required(VERSION 3.17)
project(Test)

set(CMAKE_CXX_STANDARD 14)
add_library(lib2 SHARED test2.cpp)
add_library(lib SHARED test.cpp)
add_executable(Test main.cpp)

target_link_libraries(Test lib)
target_link_libraries(Test lib2)

正如我所说,在 Linux 上使用 gcc 构建它可以正常工作,但在 OS X 上构建它会产生错误。

我尝试了以下方法:

  • 在 OS X 上使用 g++ 构建
  • 使用“libc++”标志
  • 在没有 CLion 的情况下构建

我的环境:

  • OSX 10.15.7
  • CLION 2020.2.4

如果这是一个非常垃圾的问题,我很抱歉。 google了两天也没找到答案。

我知道我可以更改我的 cmake target_link_libraries(Test lib2) -&gt; target_link_libraries(lib lib2),但我想知道为什么这适用于 Linux 而不是 OS X。

编辑:添加 .cpp 源并包含

【问题讨论】:

  • 您是否尝试在终端仿真器中将代码编译为命令行?阅读GCCGNU make 的文档
  • 你的 main.cpp 是否包含 test.h?
  • 感谢您的快速回复。 @Basile:我尝试在我的终端中使用 cmake 和 make 构建它。这就是你的意思吗?
  • @adembudak:是的。我在 main.cpp 中包含了 test.h,在 test.h 中包含了 test2.h

标签: c++ macos cmake linker-errors


【解决方案1】:

如果 test2 依赖于 test 并且不可见,请调整您的 CMakeLists.txt

target_link_libraries(Test PUBLIC lib)
target_link_libraries(lib PRIVATE lib2)

使用cmake -G Ninja . &amp;&amp; ninja &amp;&amp; ./Test 编译在 macOS 10.15.7 上运行良好。

【讨论】:

  • 嗨 Macintron,知道我可以只使用我的 cmake。但我提供的这个例子只是一个例子。就我而言,我有大约 60.000 个 loc 我想在 Mac 上编译并修复所有库需要很多时间。我想知道,为什么这是在 linux 上编译,而不是在 Mac 上。
  • 在我看来,macOS 工作正常,因为 lib 使用 lib2 中的符号,并且在您的 CMakeLists.txt 中 lib 和 lib2 之间没有任何联系。
  • 我同意你的看法。但我认为 Mac 上的 cmake/make/clang 与 linux 上的 cmake/make/gcc 表现如此不同,这很奇怪 :)
  • clang 和 gcc 在 Mac 上失败。使用 clang/gcc 在 Linux 上进行的测试链接正常。
猜你喜欢
  • 2013-05-15
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 2011-01-13
  • 2016-10-07
相关资源
最近更新 更多