简体   繁体   English

编译错误 g++ + cmake + Conan + macOS m2 + jsoncpp

[英]Compilation error g++ + cmake + Conan + macOS m2 + jsoncpp

I'm trying to compile the following MWE that uses jsoncpp installed from Conan and set up with cmake, using g++-12 (from home-brew) but I'm clashing against all types of linking errors.我正在尝试编译以下 MWE,它使用从柯南安装的 jsoncpp 并使用 g++-12(来自自制软件)设置 cmake,但我遇到了所有类型的链接错误。 (adding repo so its easier to run the MWE https://github.com/araml/link_error ) (添加 repo 以便更容易运行 MWE https://github.com/araml/link_error

main.cpp.主.cpp。

#include <cstdio>
#include <fstream>
#include <json/json.h>

int main() { 
    std::ifstream j1_json("j1");
    
    Json::Value j1;
    Json::Reader parser;

    if (!parser.parse(j1_json, j1)) { 
        puts("Error when parsing j1");
    }

    return 0;
}

cmake cmake

cmake_minimum_required(VERSION 3.16)

project(j1_test)
enable_testing()

set(CMAKE_CXX_FLAGS "-std=c++2a -ggdb -Wall -Wextra -Og -fno-inline-functions") 
set(CMAKE_C_COMPILER "gcc-12") # I know not the best but easier here for the examples purpose
set(CMAKE_CXX_COMPILER "g++-12")

find_package(jsoncpp CONFIG REQUIRED)

add_executable(j1 src/main.cpp)
target_link_libraries(j1 JsonCpp::JsonCpp)

conanfile.txt柯南文件.txt

[requires]
     jsoncpp/1.9.5

[generators]
     CMakeDeps
     CMakeToolchain

What I'm running我在跑什么

conan install conanfile.txt --install-folder conan --build=missing -pr:b=default
mkdir -p build 
push build
cmake -DCMAKE_TOOLCHAIN_FILE=./conan/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release -G Ninja ../
cmake --build . -j 8
popd

error output (partial)错误 output(部分)

[2/2] Linking CXX executable j1
FAILED: j1
: && g++-12 -std=c++2a -ggdb -Wall -Wextra -Og -fno-inline-functions -O3 -DNDEBUG -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/j1.dir/src/main.cpp.o -o j1  /Users/meera/.conan/data/jsoncpp/1.9.5/_/_/package/2f2de4e3345f667bb03ed16a03f45c72c978d397/lib/libjsoncpp.a && :
Undefined symbols for architecture arm64:
  "__ZN4Json6Reader5parseERSiRNS_5ValueEb", referenced from:
      _main in main.cpp.o
  "__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE4findEcm", referenced from:
      __ZN4Json12_GLOBAL__N_113valueToStringEdbjNS_13PrecisionTypeE in libjsoncpp.a(json_writer.cpp.o)
  "__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE7compareEmmPKcm", referenced from:
      __ZNK4Json19StreamWriterBuilder15newStreamWriterEv in libjsoncpp.a(json_writer.cpp.o)
  "__ZNKSt3__115basic_stringbufIcNS_11char_traitsIcEENS_9allocatorIcEEE3strEv", referenced from:
      __ZN4Json5ValueC2EPKc in libjsoncpp.a(json_value.cpp.o)
      __ZN4JsonL29duplicateAndPrefixStringValueEPKcj in libjsoncpp.a(json_value.cpp.o)
      __ZNK4Json5Value9asCStringEv in libjsoncpp.a(json_value.cpp.o)
      __ZNK4Json5Value8asStringEv in libjsoncpp.a(json_value.cpp.o)
      __ZNK4Json5Value5asIntEv in libjsoncpp.a(json_value.cpp.o)
      __ZNK4Json5Value6asUIntEv in libjsoncpp.a(json_value.cpp.o)
      __ZNK4Json5Value7asInt64Ev in libjsoncpp.a(json_value.cpp.o)

If I set libc++, -lc++ , I get a different type of error如果我设置 libc++, -lc++ ,我会得到不同类型的错误

-- Using Conan toolchain: jsoncpp_test/conan/conan_toolchain.cmake
-- Conan: Target declared 'JsonCpp::JsonCpp'
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/meera/Projects/jsoncpp_test/build
[2/2] Linking CXX executable j1
FAILED: j1
: && g++-12 -std=c++2a -ggdb -Wall -Wextra -lc++ -Og -fno-inline-functions -O3 -DNDEBUG -arch arm64 -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/j1.dir/src/main.cpp.o -o j1  /Users/meera/.conan/data/jsoncpp/1.9.5/_/_/package/2f2de4e3345f667bb03ed16a03f45c72c978d397/lib/libjsoncpp.a && :
Undefined symbols for architecture arm64:
  "__ZN4Json6Reader5parseERSiRNS_5ValueEb", referenced from:
      _main in main.cpp.o
ld: symbol(s) not found for architecture arm64
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
~/Projects/jsoncpp_test

Compiling with apple-clang works just fine but I need to use g++-12 since clang doesn't support some of the features I want to use.使用 apple-clang 编译工作正常,但我需要使用 g++-12,因为 clang 不支持我想使用的某些功能。

Maybe a lack of information in your profile.也许您的个人资料中缺少信息。 You have to be very explicit.你必须非常明确。 Indeed on macOS, gcc & g++ are aliases for Apple clang. It works fine with this conan profile (I'm on macOS Intel, so I've tested with a different arch):事实上,在 macOS 上,gcc 和 g++ 是 Apple clang 的别名。它适用于这个 conan 配置文件(我在 macOS Intel 上,所以我用不同的 arch 进行了测试):

macos-armv8-gcc12 profile macos-armv8-gcc12 配置文件

cc=/usr/local/bin/gcc-12
cxx=/usr/local/bin/g++-12
ar=/usr/local/bin/gcc-ar-12
nm=/usr/local/bin/gcc-nm-12
ranlib=/usr/local/bin/gcc-ranlib-12

[settings]
os=Macos
arch=armv8
compiler=gcc
compiler.version=12
compiler.libcxx=libstdc++11
build_type=Release
[options]
[tool_requires]
[conf]
tools.apple:sdk_path=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
tools.build:compiler_executables={"c": "$cc", "cpp": "$cxx"}
[buildenv]
CC=$cc
CXX=$cxx
AR=$ar
NM=$nm
RANLIB=$ranlib

# legacy
[env]
CC=$cc
CXX=$cxx
AR=$ar
NM=$nm
RANLIB=$ranlib

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM