Mac下C++编译时报错“Undefined symbols for architecture x86_64”

在Mac上编译使用OpenSSL SHA1算法的C++程序时遇到'Undefined symbols for architecture x86_64'错误。尝试修改Makefile添加-arch参数,更换OpenSSL库,但问题依旧。最终发现需添加'-lcrypto'链接libcrypto库才能解决。警告显示SHA1函数在OS X 10.7已被弃用,但仍然可用。
部署运行你感兴趣的模型镜像

在Linux下实现了一个有关使用OPENSSL中SHA1算法的程序,直接copy到mac机下编译出现如下错误:

Undefined symbols for architecture x86_64:

  "_SHA1_Final", referenced from:

      fixSignatureHeader(char*, int) in main.o

  "_SHA1_Init", referenced from:

      fixSignatureHeader(char*, int) in main.o

  "_SHA1_Update", referenced from:

      fixSignatureHeader(char*, int) in main.o

ld: symbol(s) not found for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)


Makefile大概如下:

  cc = g++

  CFLAGS = -g -w -Wall

  LIBS = -lssl

  CPP_OBJS :=$(patsubst %.cpp,%.o,$(wildcard ./src/*.cpp))

  C_OBJS :=$(patsubst %.c,%.o,$(wildcard ./libaes/*.c))

  all:$(CPP_OBJS)$(C_OBJS)

          $(cc)$(CFLAGS) $(CPP_OBJS)$(C_OBJS) -o ./bin/a.out $(LIBS)

          rm -f $(CPP_OBJS)$(C_OBJS)

  .cpp.o:

          $(cc) -c$(CFLAGS) $< -o$@

  .c.o:

          $(cc) -c$(CFLAGS) $< -o$@  

  .PHONY:clean

  clean:

          rm -f $(CPP_OBJS)$(C_OBJS)

从错误的字面意思应该是对应x86_64架构下的库中找不到“SHA1_Init” “SHA1_Update”这些符号,查了一下x86_64是Mac的模拟编译平台,是64位的,难道是因为这个?然后我编译是添加了-arch i386参数改为了32位编译,但是报了如下错误:


Undefined symbols for architecture i386:

  "_main", referenced from:

     implicit entry/start for main executable

ld: symbol(s) not found for architecture i386

clang: error: linker command failed with exit code 1 (use -v to see invocation


更加摸不到头脑了,在网上查了半天资料都没有解决办法,但可以肯定是这些符号没有找到,要么是库没有链接正确,要么是少链接什么库。

后来想到Mac下Openssl是Xcode中自带的,我又从官网重新down了一份openssl的源码,然后./Configure darwin64-x86_64-cc,make,make install,并指定了新库的目录,仍然报相同的错,这我就不明白了,我已经将libssl按照x86_64编译生成了,而且我用file命令查看了新生成的openssl命令,确实是x86_64架构,不应该再报找不到x86_64架构下相关符号了。

浪费了一下午时间也没有解决,实在没有办法,用eclipse创建了一个c++项目,在这个工程中引用了sha.h,然后调用相关的函数,最后编译(eclipse会自动生成Makefile),报如下错误:

./src/test.cpp:22:2: warning: 'SHA1_Init' is deprecated: first deprecated in OS X 10.7 [-Wdeprecated-declarations]

        SHA1_Init(&c);

。。。。。

Undefined symbols for architecture x86_64:

  "_SHA1_Final", referenced from:

      _main in ApkProtect.o

  "_SHA1_Init", referenced from:

      _main in ApkProtect.o

  "_SHA1_Update", referenced from:

      _main in ApkProtect.o

ld: symbol(s) not found for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)


下面的错误一样,但是多了一些warning,说SHA1相关的函数在OS X 10.7时就已经被deprecated了,然后搜索了解决办法,虽然已经遗弃,但只是建议性的,还是可以使用的,只不过编译的时候要添加-lcrypto,链接:http://stackoverflow.com/questions/19840220/sha1-is-deprecated-first-deprecated-in-os-x-10-7,把libcrypto这个库链接进来,然后就编译通过了!

网上查了一下如果要应用一些加密算法的话建议使用libcrypto这个库,如果涉及到SSL等PKI协议的话建议使用openssl。


花了一整天时间来弄这个东西,真是太浪费时间了,还有好多问题没有解决,比如红字的部分,还有x86_64和i386分别代表什么以及区别,怎样指定x86_64以外的架构等具体的机制等等。由于还有其他工作要做,这些就留待以后搞明白吧。

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

x86_64 架构下编译时出现的链接错误 `Undefined symbols for architecture x86_64: "_main"`,通常意味着编译器无法找到程序的入口点 `main` 函数。以下是一些常见的原因和对应的解决方案: ### 1. **确保包含 main 函数** 程序必须包含一个 `main` 函数作为入口点。如果 `main` 函数缺失、拼写错误或者未被正确编译,就会导致链接失败。确保代码文件中包含类似以下的函数: ```cpp int main() { // Your code here return 0; } ``` 此外,检查 `main` 函数是否被错误地定义为其他形式,例如 `void main()` 或者 `int Main()`,这些形式不符合标准 C/C++ 规范,可能会导致链接器无法识别入口点[^1]。 ### 2. **正确编译包含 main 函数的文件** 如果项目中包含多个 `.cpp` 文件,确保包含 `main` 函数的文件被正确编译和链接。某些 IDE(如 CLion 或 Xcode)依赖 `CMakeLists.txt` 或项目配置文件来决定哪些文件需要编译。如果 `main` 函数所在的文件未被正确添加到构建配置中,则会导致链接错误。例如,在 `CMakeLists.txt` 中确保包含以下内容: ```cmake add_executable(my_program main.cpp other_files.cpp) ``` 如果使用自动遍历 `.cpp` 文件的方法,需要确保 `main` 函数所在的文件被正确识别并包含在编译过程中,否则某些没有 `main` 函数的文件可能不会被编译,从而导致链接失败[^4]。 ### 3. **检查 IDE 或编辑器的配置** 在某些编辑器(如 VSCode 或 Xcode)中,新建文件时可能不会自动将文件添加到构建流程中。例如,在 VSCode 中,如果手动添加了头文件(`.h`)或源文件(`.cpp`),但未正确配置任务或 `tasks.json` 文件,可能会导致编译器忽略这些文件。确保文件被正确添加到项目的构建配置中,并且编译命令能够识别到 `main` 函数所在的源文件[^2]。 ### 4. **检查编译命令和链接器设置** 如果使用命令行工具(如 `clang++` 或 `g++`)进行编译,确保所有需要的源文件都被包含在编译命令中。例如: ```bash clang++ main.cpp other_file.cpp -o my_program ``` 如果遗漏了包含 `main` 函数的文件,则链接器无法找到入口点。此外,确保没有错误地使用了编译标志,例如 `-c` 标志只会编译而不链接,可能导致最终的可执行文件未生成。 ### 5. **检查 Objective-C 或混合语言项目中的链接问题** 如果项目中包含 Objective-C 或混合编程(如 C++ 和 Objective-C 混合),可能会遇到特定类(如 `AppDelegate`)未被正确链接的问题。这种情况下,需要检查 Xcode 的 `Build Phases > Compile Sources` 设置,确保相关类的实现文件(如 `AppDelegate.m`)被正确添加到编译列表中[^3]。 ### 6. **清理和重新构建项目** 有时旧的编译残留文件可能导致链接错误。尝试清理项目并重新构建: - 在 Xcode 中选择 `Product > Clean Build Folder`。 - 在 CLion 或 VSCode 中,手动删除 `build` 目录并重新生成。 ### 7. **检查架构设置** 如果目标架构设置不正确,也可能导致链接错误。确保编译器设置的目标架构与运行环境一致。例如,在 macOS 上,确保使用 `-arch x86_64` 编译以支持 x86_64 架构: ```bash clang++ -arch x86_64 main.cpp -o my_program ``` ### 8. **检查模板或框架依赖** 如果使用了特定的框架或模板(如 Qt、SFML 等),确保这些依赖项被正确配置,并且与当前架构兼容。某些框架可能需要额外的链接标志或配置才能正常工作。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值