【发布时间】: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 && cmake -G Xcode -S . -B build_dir && 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