簡體   English   中英

在 M1 Mac 上從 C++ 鏈接到 curl - arm64 的未定義符號

[英]Linking to curl from C++ on M1 Mac - undefined symbols for arm64

我有一個在 Windows 和 Linux 上的現有項目。 我最近第一次獲得了 Mac,我正在嘗試將其設置為 C++ 開發,但我相信我在鏈接到 curl 時遇到問題。

據我所知,curl 通過自制軟件支持基於 M1 arm 的芯片,我使用homebrew install curl

下面是我的制作文件

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

我已經嘗試將 -arch 設置為 x86_64 作為對 LDFLAGS 的測試,然后它成功編譯並創建了庫,但我真的不認為我應該在應該為 M1 構建 x86_64 時構建它,並且因此更快,因為它不必通過羅塞塔 go。

如果我運行lipo -info /opt/homebrew/opt/curl/bin/curl來檢查庫的體系結構,我會得到以下信息:

Non-fat file: /opt/homebrew/opt/curl/bin/curl is architecture: arm64

所以 curl 看起來是正確的,所以不知道為什么我收到錯誤 undefined symbols for arm64

我在您的 makefile 中沒有看到對curl庫的任何引用。 要糾正這個問題,您(可能)需要將-lcurl添加到您的LDFLAGS中。

此外, /opt/homebrew/opt/curl/bin/curl是 curl 可執行文件,而不是庫。 那是(可能) /opt/homebrew/opt/curl/lib/libcurl.so

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM