我在macos下測驗openssl。首先,我通過brew install openssl安裝了openssl,安裝位置是:/usr/local/Cellar/openssl@3/3.0.5/。然后我創建了一個簡單的macos命令列專案,然后寫了一些非常簡單的代碼來參考openssl加解密庫。

為了通過編譯,我在頭檔案搜索路徑中添加了openssl的include路徑。

然后我在 Build Phase 選項中添加了對 libcrypto.a 的參考。據我了解,這個庫應該是一個靜態庫,然后在鏈接時,聯結器應該將其所有代碼復制到我的行程中,而不添加對其他動態庫的參考。但奇怪的是,當我嘗試除錯和運行專案時,行程實際上嘗試加載一個我從未參考過的動態庫 libcrypto.3.dylib,并且加載失敗,因為動態庫沒有簽名。

dyld[4481]: Library not loaded: '/usr/local/opt/openssl@3/lib/libcrypto.3.dylib'
Referenced from: '/Users/dongbo/Library/Developer/Xcode/DerivedData/TestOpenSSL-abmortoxmqaalbcuirkuraizktsa/Build/Products/Debug/TestOpenSSL'
Reason: tried: '/Users/dongbo/Library/Developer/Xcode/DerivedData/TestOpenSSL-abmortoxmqaalbcuirkuraizktsa/Build/Products/Debug/libcrypto.3.dylib' (no such file), '/usr/lib/system/introspection/libcrypto.3.dylib' (no such file), '/usr/local/opt/openssl@3/lib/libcrypto.3.dylib' (code signature in <BF9EFA44-EE24-3AF6-B0D4-3DFC6E454288> '/usr/local/Cellar/openssl@3/3.0.5/lib/libcrypto.3.dylib' not valid for use in process: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.), '/usr/local/lib/libcrypto.3.dylib' (no such file), '/usr/lib/libcrypto.3.dylib' (no such file), '/Users/dongbo/Library/Developer/Xcode/DerivedData/TestOpenSSL-abmortoxmqaalbcuirkuraizktsa/Build/Products/Debug/libcrypto.3.dylib' (no such file), '/usr/lib/system/introspection/libcrypto.3.dylib' (no such file), '/usr/local/Cellar/openssl@3/3.0.5/lib/libcrypto.3.dylib' (code signature in <BF9EFA44-EE24-3AF6-B0D4-3DFC6E454288> '/usr/local/Cellar/openssl@3/3.0.5/lib/libcrypto.3.dylib' not valid for use in process: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.), '/usr/local/lib/libcrypto.3.dylib' (no such file), '/usr/lib/libcrypto.3.dylib' (no such file)
Program ended with exit code: 9
我在英特爾架構 imac 上進行測驗時遇到了這個錯誤,但神奇的是,我在 m1 上做同樣的事情沒有任何問題,除了我的 m1 pro 關閉了 sip。不知道大家有沒有知道這是什么原因呢?
all test codes:
#import <Foundation/Foundation.h>
#include <string>
#include <openssl/rsa.h>
#include <openssl/pem.h>
const std::string pk = std::string("-----BEGIN PUBLIC KEY-----\n")
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDTlCZFucurE QNupniPUXz5RwN\n"
"dhRAplB jd51U4NTcpDl4AL3LppKdRxEyt4FlvLiE66tmonEJTc4BcaRurxxXOuY\n"
" 0IS4l28FynYT/yDpdoiop0Jf2NCa8V5nCBISKp1Lgvz7AbHBw 3KNCF1UdrOeRs\n"
"r/GBOSXosmTzPMRUNwIDAQAB\n"
"-----END PUBLIC KEY-----";
std::string decrypt_string(const void* data, size_t length)
{
BIO* bio = BIO_new_mem_buf(pk.c_str(), (int)pk.size());
RSA* rsa = NULL;
PEM_read_bio_RSA_PUBKEY(bio, &rsa, 0, 0);
char buf[1024] = {0};
int ret = RSA_public_decrypt(0x80, (const unsigned char*)data, (unsigned char*)buf, rsa, RSA_PKCS1_PADDING);
if(ret == -1)
{
BIO_free(bio);
printf("decrypt error:%d\n", ret);
return "Error";
}
BIO_free(bio);
std::string str = buf;
return buf;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
}
return 0;
}
uj5u.com熱心網友回復:
首先,openssl實際上被認為已棄用,并且從macOS SDK 10.11中洗掉了相應的標頭(替換為
- 提供系統頭檔案的路徑(它可以只是頭檔案路徑,但我更喜歡 3-rd 方庫的系統頭檔案以避免多余的警告):

- 將存檔添加到Embed Frameworks而不是Link Binary構建階段(我們避免使用Link Binary步驟,因為如果庫存在于過時的 macOS SDK 中,Xcode 郵件無法將其與嵌入式版本消除歧義):

- 將聯結器標志添加到指向專案目錄中存檔的構建設定(不要擔心產品不存在這樣的目錄,嵌入框架階段會將此路徑決議為正確的路徑):

此時庫應該沒有錯誤地鏈接。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/514421.html
上一篇:為什么Cocoa應用和控制臺應用中NSApplicationSupportDirectory的路徑不一樣?
下一篇:將python連接到sqlite
