簡體   English   中英

如何在MAC OS X的CMAKE項目中包括C靜態庫

[英]How to include C static libraries in CMAKE project on MAC OS X

我正在嘗試使用C / C ++學習Core Foundation。 我使用使用CMAKE的JetBrains CLion。

問題是-我不知道如何在Mac上的C / C ++ Makefile項目中包括適當的靜態庫。

我需要將靜態庫CFNetwork鏈接到我的項目,以解決鏈接問題。

你能給我個快速提示嗎?

我的情況:

#include <CFNetwork/CFNetwork.h>
#include <iostream>

int main() {
    CFStringRef bodyString = CFSTR(""); // Usually used for POST data
    CFDataRef bodyData = CFStringCreateExternalRepresentation(kCFAllocatorDefault,
        bodyString, kCFStringEncodingUTF8, 0);

    CFStringRef headerFieldName = CFSTR("X-My-Favorite-Field");
    CFStringRef headerFieldValue = CFSTR("Dreams");

    CFStringRef url = CFSTR("http://www.apple.com");
    CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, url, NULL);

    CFStringRef requestMethod = CFSTR("GET");
    CFHTTPMessageRef myRequest =
        CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, myURL,
                kCFHTTPVersion1_1);

    CFHTTPMessageSetBody(myRequest, bodyData);
    CFHTTPMessageSetHeaderFieldValue(myRequest, headerFieldName, headerFieldValue);
    CFDataRef mySerializedRequest = CFHTTPMessageCopySerializedMessage(myRequest);

    return 0;
}

我可以編譯它,但是鏈接器向我輸出以下內容:

"/Applications/CLion EAP.app/Contents/bin/cmake/bin/cmake" --build /Users/nickolay/Library/Caches/clion10/cmake/generated/3546f185/3546f185/Debug --target test001 -- -j 8
Scanning dependencies of target test001
[100%] Building CXX object CMakeFiles/test001.dir/main.cpp.o
Linking CXX executable test001
Undefined symbols for architecture x86_64:
  "_CFHTTPMessageCopySerializedMessage", referenced from:
      _main in main.cpp.o
  "_CFHTTPMessageCreateRequest", referenced from:
      _main in main.cpp.o
  "_CFHTTPMessageSetBody", referenced from:
      _main in main.cpp.o
  "_CFHTTPMessageSetHeaderFieldValue", referenced from:
      _main in main.cpp.o
  "_CFStringCreateExternalRepresentation", referenced from:
      _main in main.cpp.o
  "_CFURLCreateWithString", referenced from:
      _main in main.cpp.o
  "___CFConstantStringClassReference", referenced from:
      CFString in main.cpp.o
      CFString in main.cpp.o
      CFString in main.cpp.o
      CFString in main.cpp.o
      CFString in main.cpp.o
  "_kCFAllocatorDefault", referenced from:
      _main in main.cpp.o
  "_kCFHTTPVersion1_1", referenced from:
      _main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [test001] Error 1
make[2]: *** [CMakeFiles/test001.dir/all] Error 2
make[1]: *** [CMakeFiles/test001.dir/rule] Error 2
make: *** [test001] Error 2

終於解決了。

感謝此資源: http : //raycast.net/clion-multiple-binaries

這是我的CMAKE文件的樣子,所有鏈接:

cmake_minimum_required(VERSION 2.8.4)
project(test001)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES main.cpp)

find_library(corefoundation_lib CoreFoundation)
find_library(cfnetwork_lib CFNetwork)

set(frameworks
    ${cfnetwork_lib}
    ${corefoundation_lib})

add_executable(test001 ${SOURCE_FILES})
target_link_libraries(test001 ${frameworks})

我不確定這是否是您要解決的問題,但是您通過將-llibrary標志提供給編譯器(其中庫文件的名稱為liblibrary.a)來鏈接C靜態庫。 如果該庫不在某個默認庫位置(idk對於Mac是什么),則可以使用-L標志指定路徑。

暫無
暫無

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

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