【问题标题】:Including external libraries in CodeRunner 2 app?在 CodeRunner 2 应用程序中包含外部库?
【发布时间】:2018-01-05 08:02:02
【问题描述】:

我一直使用 Xcode 在 C++ 中编译基于 OpenCV 的代码。 Xcode 中的过程非常简单,我只需要提及路径并将必要的 lib 文件添加到项目中即可。有这个应用程序称为CodeRunner 2 用于 macOS。没有关于如何包含外部库以在此应用程序中编译代码的适当文档。是否可以链接 OpenCV 头文件并在 CodeRunner 中编译它们?如果是,有人可以发布这些步骤吗?

【问题讨论】:

    标签: c++ opencv coderunner


    【解决方案1】:

    您可以通过设置新语言在 CodeRunner 中运行 OpenCV。转到首选项 -> 语言,右键单击 C++,然后选择复制。将新语言命名为“C++ OpenCV”。在首选项窗口的右侧,单击设置,然后单击编辑脚本按钮。寻找这一行(或类似的东西):

    xcrun clang++ -x c++ -lc++ -o "$out" "${files[@]}" "${@:1}"
    

    "$out"之后添加OpenCV的clang++命令行参数。这是我的版本:

    xcrun clang++ -x c++ -lc++ -o "$out" -I/usr/local/opt/opencv3/include -L/usr/local/opt/opencv3/lib -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs -lopencv_videoio -lopencv_calib3d "${files[@]}" "${@:1}"
    

    修改 -I 和 -L 参数以匹配您的 OpenCV 安装路径。在这台机器上,我使用 Homebrew 安装 OpenCV,所以它安装在 /usr/local/opt 中。在我从源代码编译的其他机器上,因此 OpenCV 安装在 /usr/local/lib 中。

    修改-l 参数以包含您通常使用的库。

    保存编译脚本后,返回 Preferences -> Languages 并选择 Templates 按钮。您可以为 OpenCV 程序设置模板。这是我的:

    #include <iostream>
    
    #include "opencv2/core.hpp"
    #include "opencv2/imgproc.hpp"
    #include "opencv2/highgui.hpp"
    
    using namespace std;
    
    int main(int argc, char *argv[]) {
        cv::Mat image;
        // read an image
        if (argc < 2)
            image = cv::imread("img.jpg");
        else
            image = cv::imread(argv[1]);
    
        if (!image.data) {
            std::cout << "Image file not found\n";
            return 1;
        }
    
        // create image window named "asdfasdf"
        cv::namedWindow("asdfasdf");
        // show the image on window
        cv::imshow("asdfasdf", image);
        // wait for key
        cv::waitKey(0);
    
        return 0;
    }
    

    【讨论】:

    • 我不知道 Xcode 是否仍然支持 gcc,但如果支持,您应该可以在编译脚本中将 g++ 替换为 clang++
    【解决方案2】:

    SSteve 之前的回复很棒,也帮助我整理了 CodeRunner 中的链接 Boost 库。

    由于上一个回复中的解决方案是针对OpenCV库的,一般情况下,不小心将外部库添加到clang++命令行中可能只会产生大量的构建错误,我尝试时就是这种情况链接 Boost 库。

    在这里,我想澄清一下 SSteve 回复中不清楚的地方,以便每个人都知道在 Mac OS 系统中使用外部库编译代码之前如何以及在何处修改命令行。

    我会用我的案例来解释,但在某些时候我会告诉你 CodeRunner 设置或一般命令行输入中的棘手部分。

    我使用macport 来安装Boost

    sudo port install boost
    
    • 头文件位于/opt/local/include
    • 库位于/opt/local/lib/

    如果您在 Boost 中找不到特定的子库,请打开终端并输入

    cd /opt/local/lib/
    find . -iname "*boost*"
    

    您应该看到 Boost 的所有子库(静态库以 .a 结尾,动态库以 .dylib 结尾)如下所示。

    在开始之前修改原来的命令行(支持c++ 14版本)比如

    xcrun clang++ -x c++ -std=c++14 -stdlib=libc++ -lc++ -o "$out" "${files[@]}" "${@:1}" ${CR_DEBUGGING:+-g}
    

    你需要知道头文件的目录在-I之后,Boost库的目录在-L之后,比如

    -I /opt/local/include/
    -L /opt/local/lib/
    

    为了在Boost中使用编译的静态或动态子库(见上图),你必须在-L /opt/local/lib/之后专门包含它。但是,简单地复制库名称而不带文件扩展名 .a.dylib 永远不会让 CodeRunner 找到您希望运行的库!!!

    详细解释here,我只是引用下面的重要部分

    clang -dynamiclib -o libtest.dylib file1.o file2.o -L/some/library/path -lname_of_library_without_lib_prefix
    

    Boost Quickstart Document中运行这样的示例代码

    #include <boost/regex.hpp>
    #include <iostream>
    #include <string>
    
    int main()
    {
        std::string line;
        boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" );
    
        while (std::cin)
        {
            std::getline(std::cin, line);
            boost::smatch matches;
            if (boost::regex_match(line, matches, pat))
                std::cout << matches[2] << std::endl;
        }
    }
    

    现在包含&lt;boost/regex.hpp&gt; 的方法是通过

    xcrun clang++ -x c++ -std=c++14 -stdlib=libc++ -lc++ -o "$out" -I /opt/local/include/ -L /opt/local/lib -lboost_regex-mt "${files[@]}" "${@:1}" ${CR_DEBUGGING:+-g}
    

    通过使用此命令行,您应该能够使用 Boost 库编译示例代码。

    只需记住将前缀-lib 替换为-l 并在命令行中排除文件扩展名。

    最后,有一些替代解决方案可以使用 Xcode 包含外部库,位于here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-29
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 2016-05-05
      相关资源
      最近更新 更多