本文介绍了如何在Mac OS X上的CMAKE项目中包含C静态库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想用C / C ++学习Core Foundation。
我使用JetBrains CLion使用CMAKE。



问题是 - 我不知道如何在Mac上的C / C ++ Makefile项目中包含合适的静态库。 p>

我需要将静态库CFNetwork链接到我的项目,以修复链接问题。



快速提示?



我的案例:

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

int main(){
CFStringRef bodyString = CFSTR(); //通常用于POST数据
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 
扫描目标的依赖关系test001
[100%]构建CXX对象CMakeFiles / test001.dir / main.cpp。 o
链接CXX可执行文件test001
架构x86_64的未定义符号:
_CFHTTPMessageCopySerializedMessage,引用自:
_main in main.cpp.o
_CFHTTPMessageCreateRequest从:
_main in main.cpp.o
_CFHTTPMessageSetBody,引用自:
_main in main.cpp.o
_CFHTTPMessageSetHeaderFieldValue,引用自:
_main in main.cpp.o
_CFStringCreateExternalRepresentation,引用自:
_main in main.cpp.o
_CFURLCreateWithString,引用自:main.cpp中的
_main。 o
___CFConstantStringClassReference,引用自:
main.cpp.o中的CFString
main.cpp.o中的CFString
main.cpp.o中的CFString
CFString in main.cpp.o
main.cpp.o中的CFString
_kCFAllocatorDefault,引用自:
_main in main.cpp.o
_kCFHTTPVersion1_1,引用源自:
_main in main.cpp.o
ld:没有为架构x86_64找到符号
clang:error:linker命令失败,退出代码1(使用-v查看调用)
make [3]:*** [test001]错误1
make [2]:*** [CMakeFiles / test001.dir / all]错误2
make [1] * [CMakeFiles / test001.dir / rule]错误2
make:*** [test001]错误2




感谢这个资源:



这是我的CMAKE文件看起来像和一切链接:

  cmake_minimum_required(VERSION 2.8.4)
项目(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})


I am trying to learn Core Foundation with C/C++.I use JetBrains CLion that uses CMAKE.

The problem is - I dunno how to include proper static libraries in C/C++ Makefile project on Mac.

I need to link static library CFNetwork to my project in order to fix linking problems.

Could you give me a quick hint?

My case:

#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;
}

I can compile this but linker outputs me the following:

"/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
解决方案

Finally resolved.

Thanks to this resource: http://raycast.net/clion-multiple-binaries

This is how my CMAKE file looks like and everything links:

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})

这篇关于如何在Mac OS X上的CMAKE项目中包含C静态库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-04 00:17
查看更多