【问题标题】:CMake project with CPP and ASM带有 CPP 和 ASM 的 CMake 项目
【发布时间】:2021-12-19 00:20:50
【问题描述】:

尝试在 CPP 中使用外部 ASM 功能制作 hello world 项目。

CMakeLists.txt

cmake_minimum_required(VERSION 3.11)

project(TestProject VERSION 0.1 LANGUAGES CXX ASM)

set_property(SOURCE foo.s APPEND PROPERTY COMPILE_OPTIONS "-x" "assembler-with-cpp")

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

add_executable(TestProject main.cpp foo.s)

target_include_directories(TestProject PUBLIC
              "${PROJECT_BINARY_DIR}"
              )

foo.s

.text
.globl _foo
_foo:
add %esi, %edi // add x and y
mov %edi, %eax // move result to correct register for return value
ret

main.cpp

#include <iostream>

using namespace std;

int foo(int x, int y);

int main() {
  int result = foo(100, 200);
  cout << result << endl;
}

我可以成功地为我的 IDE 生成项目

cmake .. -G Xcode

如果我在 IDE 中构建它,我会收到此错误:

Error 
Undefined symbol: foo(int, int)

如果我尝试从终端构建

cmake --build ..

我收到 CMakeCache.txt 错误:

Error: could not load cache

CPP(仅限)项目在机器上构建良好。 假设生成的 CMakeCache.txt 有问题但可以得到它。

CMakeCache.txt: https://pastebin.com/BSbZfA67

【问题讨论】:

  • 你使用的cmake命令在当前工作目录下设置项目,你设置项目的目录需要通过--build传递,即你应该使用cmake --build .而不是cmake --build ..,假设您没有更改工作目录。不过,这不会改变链接器结果。
  • @fabian 没有提及,但我从脚本文件夹运行 cmake 命令。无论如何 cmake --build 。在根项目文件夹中出现错误:无法加载缓存
  • 假设您已经成功配置了项目,cmake 在某个目录下创建了一个CMakeCache.txt 文件。您收到的错误消息表明通过--build 传递的目录中缺少此信息。还有一件事让我觉得很奇怪:通常源目录作为最后一个参数传递给 cmake 生成。您确定配置成功完成了吗?顺便说一句:我个人的偏好是使用-S+-Be.g. mkdir build_dir &amp;&amp; cmake -G Xcode -S . -B build_dir &amp;&amp; cmake --build build_dir 在 build_dir 的当前目录中设置和构建项目
  • @fabian 用 mkdir build_dir && cmake -G Xcode -S 拯救我的夜晚 :)。 -B build_dir && cmake --build build_dir 一切都是从终端生成和构建的。 Ofc 是我的错误 cmake .. -G Xcode

标签: c++ macos assembly cmake x86


【解决方案1】:

您已声明 foo 具有 C++ 链接,但将其定义为具有 C 链接。要解决此问题,请声明 foo 改为使用 C 链接:

extern "C" int foo(int x, int y);

【讨论】:

  • 谢谢你!但是 extern "C" int foo(int x, int y);带返回值。它不在 IDE 中调试,但至少可以构建。
  • @k.makarov 当您尝试调试时会发生什么?
  • 在我清理并重新生成 IDE 中的项目调试后也可以正常工作。谢谢!
猜你喜欢
  • 2019-05-18
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
相关资源
最近更新 更多