Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从C+链接到curl+;M1 Mac上-arm64的未定义符号_C++_Macos_Curl_Apple M1 - Fatal编程技术网

C++ 从C+链接到curl+;M1 Mac上-arm64的未定义符号

C++ 从C+链接到curl+;M1 Mac上-arm64的未定义符号,c++,macos,curl,apple-m1,C++,Macos,Curl,Apple M1,我有一个在Windows和Linux上的现有项目。我最近第一次得到了一个Mac,我正试图为C++开发设置它,但是我有一个链接到CURL,我相信。 据我所见,curl通过我使用自制安装curl安装的自制软件支持基于M1 arm的芯片 下面是我的制作文件 SOURCES = DataDogStatsD.cpp DDEvent.cpp Helpers.cpp lib_name = libDataDogStatsD.so.1.1.0.5 curl_include = /usr/local/inclu

我有一个在Windows和Linux上的现有项目。我最近第一次得到了一个Mac,我正试图为C++开发设置它,但是我有一个链接到CURL,我相信。 据我所见,curl通过我使用
自制安装curl
安装的自制软件支持基于M1 arm的芯片

下面是我的制作文件

SOURCES = DataDogStatsD.cpp DDEvent.cpp Helpers.cpp

lib_name = libDataDogStatsD.so.1.1.0.5

curl_include = /usr/local/include/curl
rapidjson_inc_path = /usr/local/include/rapidjson

OBJECTS = $(SOURCES:.cpp=.o)
CFLAGS = -fpic -c $(SOURCES) -Wall -g -Iinclude -std=c++11 -I/usr/include -I$(curl_include) -I$(rapidjson_inc_path)
CC = g++
LDFLAGS = -lpthread -pthread -lm -L/opt/homebrew/opt/curl/lib

.PHONY: clean

default:
    $(CC) -shared -Wl,-install_name,libDataDogStatsD.so.1 -o $(lib_name) $(OBJECTS) $(LDFLAGS)
    ln -sf $(lib_name) libDataDogStatsD.so

clean:
    rm -vf $(OBJECTS) depend $(lib_name)

depend: $(SOURCES)
    $(CC) $(CFLAGS) > depend

-include depend
当我运行make时,我得到以下信息:

g++ -fpic -c DataDogStatsD.cpp DDEvent.cpp Helpers.cpp -Wall -g -Iinclude -std=c++11 -I/usr/include -I/usr/local/include/curl -I/usr/local/include/rapidjson > depend
g++ -shared -Wl,-install_name,libDataDogStatsD.so.1 -o libDataDogStatsD.so.1.1.0.5 DataDogStatsD.o DDEvent.o Helpers.o -lpthread -pthread -lm -L/opt/homebrew/opt/curl/lib
Undefined symbols for architecture arm64:
  "_curl_easy_cleanup", referenced from:
      DataDogStatsD::event(DDEvent, bool, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
      DataDogStatsD::sendDDEventinthread(DDEvent, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
  "_curl_easy_getinfo", referenced from:
      DataDogStatsD::event(DDEvent, bool, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
      DataDogStatsD::sendDDEventinthread(DDEvent, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
  "_curl_easy_init", referenced from:
      DataDogStatsD::initCurl(DDEvent, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, curl_slist*, char const*) in DataDogStatsD.o
  "_curl_easy_perform", referenced from:
      DataDogStatsD::event(DDEvent, bool, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
      DataDogStatsD::sendDDEventinthread(DDEvent, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
  "_curl_easy_setopt", referenced from:
      DataDogStatsD::initCurl(DDEvent, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, curl_slist*, char const*) in DataDogStatsD.o
  "_curl_easy_strerror", referenced from:
      DataDogStatsD::event(DDEvent, bool, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
      DataDogStatsD::sendDDEventinthread(DDEvent, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
  "_curl_slist_append", referenced from:
      DataDogStatsD::initCurl(DDEvent, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, curl_slist*, char const*) in DataDogStatsD.o
  "_curl_slist_free_all", referenced from:
      DataDogStatsD::event(DDEvent, bool, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
      DataDogStatsD::sendDDEventinthread(DDEvent, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [default] Error 1
g++-fpic-c DataDogStatsD.cpp DDEvent.cpp Helpers.cpp-Wall-g-Iinclude-std=c++11-I/usr/include-I/usr/local/include/curl-I/usr/local/include/rapidjson>
g++-shared-Wl,-install_name,libDataDogStatsD.so.1-o libDataDogStatsD.so.1.1.0.5 DataDogStatsD.o DDEvent.o Helpers.o-lpthread-pthread-lm-L/opt/homebrew/opt/curl/lib
架构arm64的未定义符号:
“_curl_easy_cleanup”,引用自:
DataDogStatsD.o中的DataDogStatsD::事件(DDEvent,bool,void(*)(bool,std::_1::basic_string))
DataDogStatsD.o中的DataDogStatsD::senddeventinthread(DDEvent,void(*)(bool,std::u 1::basic_string))
“\u curl\u easy\u getinfo”,引用自:
DataDogStatsD.o中的DataDogStatsD::事件(DDEvent,bool,void(*)(bool,std::_1::basic_string))
DataDogStatsD.o中的DataDogStatsD::senddeventinthread(DDEvent,void(*)(bool,std::u 1::basic_string))
“\u curl\u easy\u init”,引用自:
DataDogStatsD.o中的DataDogStatsD::initCurl(DDEvent,std::u 1::basic_string*,curl_slist*,char const*)
“\u curl\u easy\u perform”,引用自:
DataDogStatsD.o中的DataDogStatsD::事件(DDEvent,bool,void(*)(bool,std::_1::basic_string))
DataDogStatsD.o中的DataDogStatsD::senddeventinthread(DDEvent,void(*)(bool,std::u 1::basic_string))
“_curl_easy_setopt”,引用自:
DataDogStatsD.o中的DataDogStatsD::initCurl(DDEvent,std::u 1::basic_string*,curl_slist*,char const*)
“\u curl\u easy\u strerror”,引用自:
DataDogStatsD.o中的DataDogStatsD::事件(DDEvent,bool,void(*)(bool,std::_1::basic_string))
DataDogStatsD.o中的DataDogStatsD::senddeventinthread(DDEvent,void(*)(bool,std::u 1::basic_string))
“\u curl\u slist\u append”,引用自:
DataDogStatsD.o中的DataDogStatsD::initCurl(DDEvent,std::u 1::basic_string*,curl_slist*,char const*)
“\u curl\u slist\u free\u all”,引用自:
DataDogStatsD.o中的DataDogStatsD::事件(DDEvent,bool,void(*)(bool,std::_1::basic_string))
DataDogStatsD.o中的DataDogStatsD::senddeventinthread(DDEvent,void(*)(bool,std::u 1::basic_string))
ld:未找到架构arm64的符号
叮当声:错误:链接器命令失败,退出代码为1(使用-v查看调用)
make:**[默认值]错误1
我曾尝试将-arch设置为x86_64,作为对LDFLAGS的测试,然后它成功编译并创建了库,但我并不认为我应该在为M1构建x86_64时构建它,因此速度更快,因为它不必经过Rosetta

如果我运行
lipo-info/opt/homebrew/opt/curl/bin/curl
检查库的体系结构,我会得到以下结果:

g++ -fpic -c DataDogStatsD.cpp DDEvent.cpp Helpers.cpp -Wall -g -Iinclude -std=c++11 -I/usr/include -I/usr/local/include/curl -I/usr/local/include/rapidjson > depend
g++ -shared -Wl,-install_name,libDataDogStatsD.so.1 -o libDataDogStatsD.so.1.1.0.5 DataDogStatsD.o DDEvent.o Helpers.o -lpthread -pthread -lm -L/opt/homebrew/opt/curl/lib
Undefined symbols for architecture arm64:
  "_curl_easy_cleanup", referenced from:
      DataDogStatsD::event(DDEvent, bool, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
      DataDogStatsD::sendDDEventinthread(DDEvent, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
  "_curl_easy_getinfo", referenced from:
      DataDogStatsD::event(DDEvent, bool, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
      DataDogStatsD::sendDDEventinthread(DDEvent, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
  "_curl_easy_init", referenced from:
      DataDogStatsD::initCurl(DDEvent, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, curl_slist*, char const*) in DataDogStatsD.o
  "_curl_easy_perform", referenced from:
      DataDogStatsD::event(DDEvent, bool, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
      DataDogStatsD::sendDDEventinthread(DDEvent, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
  "_curl_easy_setopt", referenced from:
      DataDogStatsD::initCurl(DDEvent, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, curl_slist*, char const*) in DataDogStatsD.o
  "_curl_easy_strerror", referenced from:
      DataDogStatsD::event(DDEvent, bool, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
      DataDogStatsD::sendDDEventinthread(DDEvent, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
  "_curl_slist_append", referenced from:
      DataDogStatsD::initCurl(DDEvent, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, curl_slist*, char const*) in DataDogStatsD.o
  "_curl_slist_free_all", referenced from:
      DataDogStatsD::event(DDEvent, bool, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
      DataDogStatsD::sendDDEventinthread(DDEvent, void (*)(bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)) in DataDogStatsD.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [default] Error 1
非fat文件:/opt/homebrew/opt/curl/bin/curl是体系结构:arm64


所以curl看起来是正确的,所以不确定为什么我会得到arm64的错误未定义符号我在makefile中没有看到任何对
curl
库的引用。要纠正此问题,您(可能)需要将
-lcurl
添加到
LDFLAGS


另外,
/opt/homebrew/opt/curl/bin/curl
是curl可执行文件,而不是库。这是(可能是)
/opt/homebrew/opt/curl/lib/libcurl。所以

谢谢,我会仔细检查,但这是一个正在工作的项目,所以如果是因为我在make文件中遗漏了一些内容,请感到有点困惑。同样,如果这就是为什么LDFLAGS中的doing-arch x86_64可以构建库的原因(不是说不是)。我假设它的卷曲度是个问题,因为这是图书馆链接到的唯一我不能回答的问题。我只是根据你的帖子上看到的来写。免责声明:我不是制造专家。你是对的,那是因为我缺少-lcurl。我想我找到了它以前工作的原因,我有-L/usr/lib64,它在搜索路径中,所以我想它总是能找到它,即使我没有明确告诉它。奇怪的是,为什么它说arm64的符号未定义,而不是说它找不到库。