在 CodeRunner 2 应用程序中包含外部库?
Including external libraries in CodeRunner 2 app?
我一直使用 Xcode 在 C++ 中编译基于 OpenCV 的代码。 Xcode 中的过程非常简单,我只需要提及路径并将必要的 lib 文件添加到项目中即可。有一个名为 CodeRunner 2 的 macOS 应用程序。没有关于如何包含外部库以在此应用程序中编译代码的适当文档。是否可以 link OpenCV headers 并在 CodeRunner 中编译它们?如果是,有人可以 post 步骤吗?
您可以 运行 通过设置新语言在 CodeRunner 中使用 OpenCV。转到首选项 -> 语言,右键单击 C++,然后 select 复制。将新语言命名为 "C++ OpenCV"。在首选项 window 的右侧,单击“设置”,然后单击“编辑脚本”按钮。寻找这一行(或类似的东西):
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
参数以包含您通常使用的库。
保存编译脚本后,返回首选项 -> 语言和 select 模板按钮。您可以为 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;
}
SSteve 之前的回复很棒,也帮助我整理了 linking Boost CodeRunner 中的库。
因为之前回复中的解决方案是特定于 OpenCV 库的,通常不小心添加到外部库的 clang++ 命令行可能会产生大量的构建错误,这是我尝试 link Boost library.
时的情况
在这里,我想澄清一下 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;
}
}
现在包含 <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 库编译示例代码。
Just remember to replace the prefix -lib
with -l
and exclude the file extension in the command line.
最后,有一些替代解决方案可以使用 Xcode 包含外部库,它位于 here
我一直使用 Xcode 在 C++ 中编译基于 OpenCV 的代码。 Xcode 中的过程非常简单,我只需要提及路径并将必要的 lib 文件添加到项目中即可。有一个名为 CodeRunner 2 的 macOS 应用程序。没有关于如何包含外部库以在此应用程序中编译代码的适当文档。是否可以 link OpenCV headers 并在 CodeRunner 中编译它们?如果是,有人可以 post 步骤吗?
您可以 运行 通过设置新语言在 CodeRunner 中使用 OpenCV。转到首选项 -> 语言,右键单击 C++,然后 select 复制。将新语言命名为 "C++ OpenCV"。在首选项 window 的右侧,单击“设置”,然后单击“编辑脚本”按钮。寻找这一行(或类似的东西):
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
参数以包含您通常使用的库。
保存编译脚本后,返回首选项 -> 语言和 select 模板按钮。您可以为 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;
}
SSteve 之前的回复很棒,也帮助我整理了 linking Boost CodeRunner 中的库。
因为之前回复中的解决方案是特定于 OpenCV 库的,通常不小心添加到外部库的 clang++ 命令行可能会产生大量的构建错误,这是我尝试 link Boost library.
时的情况在这里,我想澄清一下 SSteve 的回复中不清楚的地方,以便每个人都知道在 Mac OS 系统中使用外部库编译代码之前如何以及在何处修改命令行。
我会用我的案例来解释,但在某些时候我会告诉你 CodeRunner 设置或一般命令行输入中的棘手位。
我使用 macport
通过
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;
}
}
现在包含 <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 库编译示例代码。
Just remember to replace the prefix
-lib
with-l
and exclude the file extension in the command line.
最后,有一些替代解决方案可以使用 Xcode 包含外部库,它位于 here