我有一个可执行文件隐式加载几个.so库,所有这些都由我构建.对于部署,或至少测试/调试,我想将它们全部放在同一目录中:
my_executable
libmylib1.so
libmylib2.so
Run Code Online (Sandbox Code Playgroud)
为了让可执行文件隐式加载库,我想为可执行文件的目录设置一个rpath(DT_RUNPATH).使用OS X,我会这样做:
clang -dynamiclib -o libmylib1.dylib -install_name @rpath/libmylib1.dylib src1.c src2.c
clang -dynamiclib -o libmylib2.dylib -install_name @rpath/libmylib2.dylib src3.c src4.c
clang -o my_executable -L. -llibmylib1.so -llibmylib2.so -Wl,-rpath,@loader_path/. main.c
Run Code Online (Sandbox Code Playgroud)
请注意,@loader_path/.它在OS X中构成了可执行文件的rpath.对于Linux,我最接近的就是
gcc -dynamiclib -o libmylib1.so src1.c src2.c
gcc -dynamiclib -o libmylib2.so src3.c src4.c
gcc -o my_executable -L. -llibmylib1.so -llibmylib2.so -Wl,-rpath=. main.c
Run Code Online (Sandbox Code Playgroud)
这里的问题是在Linux上,rpath遵循当前的工作目录,而不是可执行文件的目录.有没有办法在Linux上完成同样的事情?
我正在努力理解boost::asio::streambuf::consume()和boost::asio::streambuf::commit()打电话.在文档中,我们有例子,
boost::asio::streambuf b;
std::ostream os(&b);
os << "Hello, World!\n";
// try sending some data in input sequence
size_t n = sock.send(b.data());
b.consume(n); // sent data is removed from input sequence
Run Code Online (Sandbox Code Playgroud)
和
boost::asio::streambuf b;
// reserve 512 bytes in output sequence
boost::asio::streambuf::mutable_buffers_type bufs = b.prepare(512);
size_t n = sock.receive(bufs);
// received data is "committed" from output sequence to input sequence
b.commit(n);
std::istream is(&b);
std::string s;
is >> s;
Run Code Online (Sandbox Code Playgroud)
我理解这两个调用就像我理解文档中有关它们的内容一样 - 调用consume()从内部的输入序列中删除字符boost::asio::streambuf,并调用commit()将字符从 …
我正在制作一个小内核模块,以提供用户空间访问ARMv7芯片的某些内核模式功能(特别是缓存控制).我正在阅读Corbet,Rubini和Hartman的Linux设备驱动程序.在其中,他们描述了如何制作完整的驱动程序+设备+总线.我根本不想创建一个总线驱动程序.事实上,我正在制作的"驱动程序"根本不需要与设备定义匹配 - 它与平台的CPU隐式匹配.任何人都可以向我解释:
/sysfs/modules/mymodule吗?/sys/devices/platform似乎也很有希望,也是如此/sys/devices/system/cpu.kobject/属性的现有位置,我该如何将其插入?我如何获得必要的kset?我见过的所有例子都创建了一个kset然后从它链接到kobject- 我还没有看到用于请求现有命名的API kset?很抱歉,如果这显然是不可能的,或者某些地方有一些非常直接且易于发现的例子,我还没有因某些原因而发现.任何人都可以对此有所了解吗?
我有一个使用OpenSSL 1.0.2的应用程序,我想用Wireshark检查流量.Wireshark可以(据称)解密TLS对话,前提是您提供了预主密钥.
如果我使用的是密码套件TLS_RSA_WITH_AES_256_CBC_SHA256; 任何人都可以告诉我如何从一个SSL或SSL_CTX结构中获得pre-master秘密?我可以在SSL物体内破坏不透明的结构- 这不适用于产品中的任何物品; 我只是想知道如何为Wireshark填充一个pre-master密钥文件.
我创建了几个浮点RGBA纹理......
glBindTexture( GL_TEXTURE_2D, texid[k] );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA,
GL_FLOAT, data);
Run Code Online (Sandbox Code Playgroud)
然后我在着色器程序中交替地双重缓冲渲染/采样
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D, texid[i], 0)
Run Code Online (Sandbox Code Playgroud)
...
state_tex_loc = glGetUniformLocation( program, "state_tex" )
glUniform1i( state_tex_loc, 0 )
glActiveTexture( GL_TEXTURE0 )
glBindTexture( GL_TEXTURE_2D, texid[1-i] )
Run Code Online (Sandbox Code Playgroud)
...
void main( void )
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
vec2 sample_pos = gl_Vertex.xy / vec2( xscale, yscale );
vec4 sample = texture2D( state_tex, sample_pos.xy );
sample.rgb = sample.rgb …Run Code Online (Sandbox Code Playgroud) Visual Studio 是否有任何可人工编辑的配置文件用于其键绑定?Options->Environment->Keyboard 对话框已完全损坏(或至少使用起来太乏味了)并且自 Visual C++ 5 以来一直如此,我真的只想转到 Visual Studio 将键绑定保存到的配置文件和直接编辑那个。
想法?
keyboard-shortcuts visual-studio-2008 visual-studio visual-c++
我正在努力弄清楚究竟是如何schemes工作的xcode以及它们的用途.我有一个使用外部构建系统(scons)在OS X上构建的跨平台产品.我希望能够构建/调试它Xcode,主要是因为符号搜索和调试器.我一直在使用eclipse CDT哪个效果很好,但有一些怪癖.
我可以通过创建一个空项目并添加一个"外部构建系统"目标来实现这一点.然后,作为目标的'Info'的一部分,我将'Build Tool'指定为/ usr/local/bin/scons,'Arguments'是我发送给scons的构建参数.基本上我调用了以下构建变量$(TARGET),$(BUILD_TYPE)这些变量根据构建是调试还是发布而有所不同,因此可以将它们指定为条件"构建设置".
问题是我想Menu->Project->Clean工作.它看起来像Xcode/xcodebuilder使用$(ACTION)变量来这个消息传给其他-这里$(ACTTION)要么是"打造","干净",或其他一些建设行动.请参阅xcodebuild ACTION.Scons有点不同 - 它有一个内置的清理动作,在命令行上调用scons -c.所以我的第一个想法是使用条件"构建设置"来传递这个参数,但事实证明,条件"构建设置"似乎并没有因构建而异ACTION- 只是构建体系结构和SDK.
是否可以在"构建设置"中添加表达式Xcode/xcodebuilder?还有另一种好方法可以让'清洁'Xcode与scons 一起工作吗?
在 cmakefind_library函数的文档中,我们有
CMake 变量 CMAKE_FIND_ROOT_PATH 指定一个或多个目录以添加到所有其他搜索目录之前。这有效地“重新植根”了给定位置下的整个搜索。作为 CMAKE_STAGING_PREFIX 后代的路径被排除在重新生根之外,因为该变量始终是主机系统上的路径。默认情况下 CMAKE_FIND_ROOT_PATH 为空。
CMAKE_SYSROOT 变量也可用于指定一个目录作为前缀。设置 CMAKE_SYSROOT 也有其他效果。有关更多信息,请参阅该变量的文档。
这些变量在交叉编译指向目标环境的根目录时特别有用,CMake 也会在那里搜索。默认情况下,首先搜索 CMAKE_FIND_ROOT_PATH 中列出的目录,然后搜索 CMAKE_SYSROOT 目录,然后搜索非根目录。可以通过设置 CMAKE_FIND_ROOT_PATH_MODE_LIBRARY 来调整默认行为。可以在每次调用的基础上手动覆盖此行为。通过使用 CMAKE_FIND_ROOT_PATH_BOTH,搜索顺序将如上所述。如果使用 NO_CMAKE_FIND_ROOT_PATH,则不会使用 CMAKE_FIND_ROOT_PATH。如果使用 ONLY_CMAKE_FIND_ROOT_PATH,则仅搜索根目录和 CMAKE_STAGING_PREFIX 下的目录。
(见http://www.cmake.org/cmake/help/v3.0/command/find_library.html)
我不确定你是怎么读的,但对我来说,这似乎暗示find_library将用于CMAKE_FIND_ROOT_PATH查找库。我写了以下内容cmakelists.txt:
cmake_minimum_required( VERSION 3.0 )
project( "cmakefindlibtest" )
message( "CMAKE_FIND_ROOT_PATH is ${CMAKE_FIND_ROOT_PATH}" )
list( APPEND CMAKE_FIND_ROOT_PATH "C:/DEV/lib/" )
message( "CMAKE_FIND_ROOT_PATH is now ${CMAKE_FIND_ROOT_PATH}" )
#find_library( punycode_library_test punycode PATHS "C:/DEV/lib" )
find_library( punycode_library_test punycode )
message( "punycode_library_test is now ${punycode_library_test}" )
add_executable( …Run Code Online (Sandbox Code Playgroud) 我正在使用boost附带的一个示例http服务器(在doc/html/boost_asio/example/cpp03/http/server,或者在http://www.boost.org/doc/libs/1_55_0/) doc/html/boost_asio/examples/cpp03_examples.html#boost_asio.examples.cpp03_examples.http_server).
该示例打开一个接受器套接字并侦听,剥离请求对象的请求.服务器还有一个boost asio signal_set,用于注册信号处理程序,并在收到SIGINT或SIGTERM时从io_service中取消所有asio请求.按CTRL-C键接收信号,io_service调出一个handle_stop()函数,然后调用.close()所有函数asio::ip::tcp::sockets.整个服务器正常关闭,io_service.run()呼叫退出,程序结束.
我希望能够在一个线程中启动这个http服务器,然后以编程方式取消它而不是使用信号.这样做的可接受方式是什么?我删除了signal_set信号处理程序,然后在另一个线程上启动了服务器.它可以很好地处理来自新线程的http请求.如何从另一个线程中阻止它?asio::ip::tcp::socket::close()从另一个线程调用是否安全?文档不清楚,只是这样做感觉非常,非asio-ish.实际上,当我尝试这样做时,只要我还没有接受任何http请求,它就能正常工作.如果我甚至处理了一个http请求,那么进程会在boost中崩溃:
> test_ssl_server_sa.exe!boost::detail::sp_counted_base::add_ref_lock() Line 81 + 0x3 bytes C++
test_ssl_server_sa.exe!boost::detail::shared_count::shared_count(const boost::detail::weak_count & r={...}) Line 578 + 0x12 bytes C++
test_ssl_server_sa.exe!boost::shared_ptr<http::server::connection>::shared_ptr<http::server::connection><http::server::connection>(const boost::weak_ptr<http::server::connection> & r={...}) Line 405 + 0x3f bytes C++
test_ssl_server_sa.exe!boost::enable_shared_from_this<http::server::connection>::shared_from_this() Line 49 + 0xc bytes C++
test_ssl_server_sa.exe!http::server::connection::handle_handshake(const boost::system::error_code & error={...}) Line 83 + 0x11 bytes C++
test_ssl_server_sa.exe!boost::_mfi::mf1<void,http::server::connection,boost::system::error_code const &>::operator()(http::server::connection * p=0x004b8fe8, const boost::system::error_code & a1={...}) Line 165 + …Run Code Online (Sandbox Code Playgroud) 我在 Xcode 中为 OS X 构建了一个大型的 C/C++/Objective-C 项目。该项目链接到预构建的 Qt5 库。
这一切都非常好,直到出现崩溃并且我得到一个包含 Qt 函数的堆栈跟踪。如果我单击 Qt 函数之一的堆栈帧,Xcode/lldb 将显示程序集而不是源代码 - 我使用 Qt 作为外部库,因此我的项目中没有任何 Qt 源代码。我怎样才能解决这个问题?
我已经尝试将 Qt5 源添加到项目中而不将其添加到我的可执行目标中,但是 Xcode/lldb 仍然没有“看到”源或弄清楚我添加到项目中的源文件是相同的源文件在 Qt 调试符号中引用。
我如何告诉 Xcode/lldb 在哪里可以找到我正在使用的外部库的源代码?
编辑:
只是在这里添加更多细节,当我在 Xcode/lldb 控制台中键入“目标模块查找 -t QMenuBar”时,这就是我看到的:
Best match found in /Users/ted/Documents/Projects/XXX/_build_osx/Output/Debug/XXX.app/Contents/MacOS/XXX:
id = {0x7100042d49}, name = "QMenuBar", byte-size = 48, decl = qmenubar.h:57, clang_type = "class QMenuBar : public QWidget {
static const QMetaObject staticMetaObject;
virtual const QMetaObject *metaObject() const;
virtual void *qt_metacast(const char *);
static QString tr(const …Run Code Online (Sandbox Code Playgroud)