我的CMakeLists.txt看起来像:
cmake_minimum_required(VERSION 2.8)
if(CMAKE_BUILD_TYPE STREQUAL Release)
SET(CMAKE_BUILD_TYPE Release)
SET (PROJECT_NAME location_recognition)
message("Release mode")
else()
SET(CMAKE_BUILD_TYPE Debug)
SET (PROJECT_NAME location_recognition)
SET(CMAKE_CXX_FILES "-g -Wall")
message("Debug mode")
endif()
#find QT libraries
find_package(Qt5Widgets REQUIRED)
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
FIND_PACKAGE(OpenCV REQUIRED)
FIND_PACKAGE(Boost REQUIRED)
# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)
# As moc files are generated in the binary dir, tell CMake
# to always look for includes there:
set(CMAKE_INCLUDE_CURRENT_DIR ON)
INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} )
# We need add -DQT_WIDGETS_LIB when using …
Run Code Online (Sandbox Code Playgroud) 尝试构建Opencv3.0.0(dev),cmake找到二进制和python 2位置,但不能包含python库.
我使用cmake-gui生成makefile.在配置cmake时,它会提供这条信息以及其他各种信息:
-
- Python 2:
- 翻译:/usr/bin/python2.7(ver 2.7.6)
- 图书馆:没有
- numpy:/usr/lib/python2.7/dist-packages/numpy/core/include(ver 1.8.2)
- 包路径:lib/python2.7/dist-packages
-
- Python 3:
- 口译员:/usr/bin/python3.4(版本3.4)
我已交叉检查,我提供的python2的输入都是正确的(作为附件包含):
(请在进一步阅读之前先查看图片)
所以,现在我想知道这是架构问题还是版本问题(兼容不同版本的opencv,python,cmake)
我目前使用的版本是: opencv:3.0.0-dev
python2:2.7.6
python3:3.4.0
cmake:2.8.12.2
系统:ubuntu 14.04(amd架构,64位)
Linux内核版本:Linux版本3.13.0-27-通用(buildd @ akateko)(gcc版本4.8.2(Ubuntu 4.8.2-19ubuntu1))#50-Ubuntu SMP Thu 5月15日18:06:16 UTC 2014
我,在这一点上坚持做什么.请允许有人向我推进正确的方向.
当我尝试使用导入库时
add_library(libname SHARED IMPORTED)
set_property(TARGET libname PROPERTY IMPORTED_LOCATION /<foldername>/<sub-foldername>/lib")
Run Code Online (Sandbox Code Playgroud)
cmake喊道:
位于/ CMakeLists.txt:28的CMake警告(dev)(target_link_libraries):无法为目标"libname"指定不是由此项目构建的链接库.
CMake不支持这个,但它曾经意外地工作,并且允许兼容性.
未设置策略CMP0016:如果仅参数不是目标,则target_link_libraries()报告错误.运行"cmake --help-policy CMP0016"以获取策略详细信息.使用cmake_policy命令设置策略并禁止显示此警告.此警告适用于项目开发人员.使用-Wno-dev来抑制它.
如果这是真的,那么将我的构建树中的某个库包含到另一个项目中的另一种最佳方法是什么.我有一个库设置,另一个地方有可执行文件,将使用这些库.通过cmake文档阅读,感觉这将是最好的前进方式,但看起来它只是一个受到支持的碎片.
功能
int compare(const void* a, const void* b)
{
SomeDataType g1 = *(static_cast<SomeDataType*>(a));
SomeDataType g2 = *(static_cast<SomeDataType*>(b));
g1.firstelement < g2.firstelement ? 1 : -1;
}
Run Code Online (Sandbox Code Playgroud)
此代码返回一个错误,指出"静态强制转换无法从const void*强制转换为SomeDataType*".我使用const_cast之类的
SomeDataType g1 = *(static_cast<SomeDataType*>(const_cast<void*>(a))) ;
Run Code Online (Sandbox Code Playgroud)
让这个工作.这是一种正确的方法吗?或者我错过了什么?我不太明白这是如何工作的.
我通常打开3或4个emacs,因为我在不同工作区的3或4个不同项目中工作.现在,当我尝试使用emacsclient打开一个新文件时,我无法控制它进入哪个emacs.通常它会转到其他工作区的emacs.有没有办法指定将哪些emacs打开?
一种方法是重新启动我想要该文件的服务器,但它不是我想要的解决方案.
我用QT5生成了moc文件
set (CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
Run Code Online (Sandbox Code Playgroud)
然后我使用moc文件添加到SRC
SET(SRC
src/main.cpp
src/video_widget_surface.cpp
src/video_widget.cpp
src/video_player.cpp
#moc files
moc/moc_video_player.cpp
moc/moc_video_widget.cpp
moc/moc_video_widget_surface.cpp
Run Code Online (Sandbox Code Playgroud)
最后我使用添加可执行文件
add_executable(somegui ${SRC})
Run Code Online (Sandbox Code Playgroud)
但我在moc文件中遇到错误说:
/other/workspace/perception/somestuff/moc/moc_video_widget.cpp:54:6: error: 'VideoWidget' has not been declared
/other/workspace/perception/somestuff/moc/moc_video_widget.cpp:62:19: error: 'VideoWidget' has not been declared
/other/workspace/perception/somestuff/moc/moc_video_widget.cpp:68:20: error: 'VideoWidget' has not been declared
/other/workspace/perception/somestuff/moc/moc_video_widget.cpp:68:46: error: non-member function 'const QMetaObject* metaObject()' cannot have cv-qualifier
/other/Qt5.0.1/5.0.1/gcc_64/include/QtCore/qobject.h: In function 'const QMetaObject* metaObject()':
/other/Qt5.0.1/5.0.1/gcc_64/include/QtCore/qobject.h:401:33: error: 'QScopedPointer<QObjectData> QObject::d_ptr' is protected
/other/workspace/perception/somestuff/moc/moc_video_widget.cpp:70:21: error: within this context
/other/Qt5.0.1/5.0.1/gcc_64/include/QtCore/qobject.h:401:33: error: invalid use of non-static data member 'QObject::d_ptr'
/other/workspace/perception/somestuff/moc/moc_video_widget.cpp:70:21: error: …
Run Code Online (Sandbox Code Playgroud) 我有一个模板类
template <class dataType>
class SSDFinder
{
dataType a;
dataType b;
public:
void FindSSD();
};
Run Code Online (Sandbox Code Playgroud)
实施是:
template<class dataType>
void SSDFinder<dataType>::FindSSD()
{
// some code.
}
Run Code Online (Sandbox Code Playgroud)
现在我需要专门化这个函数FindSSD,具体取决于dataType是否有2个元素,例如x,y或3个元素,例如x,y,z.
我有多种方法可以拥有2或3个元素.当我开始专门研究3个元素时,我可以拥有cv :: Point2i,cv :: Point2d.cv :: Point2f,cv :: Vec等.
类似于3元素.
有没有办法可以将所有特定组合在一起,这样所有带有2个元素的dataType只能有1个特化,而3个元素可以有另一个特化,那就是全部?
这些dataTypes中没有size()等函数可供我查找除了尝试访问它们之外的元素数量.对于前者 我无法使用dataType.type()来获取类型信息.许多数据结构没有提供.
我看到了一件有趣的事情,但不明白为什么。
template<class dataType>
Class A
{
AFnc();
}
template<> A<int>::AFnc() { }
Run Code Online (Sandbox Code Playgroud)
仅使用专用模板会产生错误,指出同一函数的多重定义。它说它是在同一个地方生成的。但如果我添加
template<class dataType>
A<dataType>::AFnc()
{
}
Run Code Online (Sandbox Code Playgroud)
然后它摆脱了错误。
为什么 ?有人可以解释这种行为。
我有一堆我必须构建的库.对于每个库,我创建了3个sym-links.我使用以下方法创建两个符号链接:
add_library(${PROJECT_NAME} ${SRC})
set_target_properties(${PROJECT_NAME} PROPERTIES SOVERSION ${perception_kit_VERSION})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} ${Boost_LIBS})
Run Code Online (Sandbox Code Playgroud)
但其余两个是使用以下方法创建的:
#code for generating symlink. will work with make install
if (CMAKE_HOST_UNIX)
set (libname_major_minor_patch "lib${PROJECT_NAME}.so.${perception_kit_VERSION_MAJOR}.${perception_kit_VERSION_MINOR}.${perception_kit_VERSION_PATCH}")
set (libname_major_minor "lib${PROJECT_NAME}.so.${perception_kit_VERSION_MAJOR}.${perception_kit_VERSION_MINOR}")
set (libname_major "lib${PROJECT_NAME}.so.${perception_kit_VERSION_MAJOR}")
set (libname "lib${PROJECT_NAME}.so")
install(CODE "
EXECUTE_PROCESS (COMMAND ln -sf ${libname_major_minor_patch} ${libname_major_minor} WORKING_DIRECTORY ${LIBRARY_OUTPUT_PATH} )
")
install(CODE "
EXECUTE_PROCESS (COMMAND ln -sf ${libname_major_minor_patch} ${libname_major} WORKING_DIRECTORY ${LIBRARY_OUTPUT_PATH} )
")
endif(CMAKE_HOST_UNIX)
Run Code Online (Sandbox Code Playgroud)
最后两个仅在使用make install时创建.有没有办法在不使用make install的情况下制作所有sym链接.?
我想用enter输入(delete-trailing-whitespace).
我找不到什么,因此我不能将它绑定到我的新功能.
我怎样才能做到这一点?