1

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

4

2 回答 2

4

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

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

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

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;
}
于 2017-07-30T01:19:45.623 回答
1

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}

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

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

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

细节在这里解释,我只是引用下面的重要部分

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

Boost快速入门文档中运行这样的示例代码

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

现在包含的方法<boost/regex.hpp>

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 包含外部库,在此处

于 2017-11-09T00:40:10.777 回答