在发布模式下链接我的项目时,我收到以下警告:
myProject-libs/release/libboost_regex-mt-s-1.50.0.a(cpp_regex_traits.o): duplicate section `.data$_ZZN5boost16cpp_regex_traitsIcE21get_catalog_name_instEvE6s_name[boost::cpp_regex_traits<char>::get_catalog_name_inst()::s_name]' has different size
Run Code Online (Sandbox Code Playgroud)
我怀疑原因可能是boost库的编译方式与我用于项目的选项不同,但我不知道如何找到差异(boost在构建过程中没有输出这些选项).
为了在Ubuntu 12.04上编译win32的boost,我使用了这个过程:
tar jxf boost_1_50_0.tar.bz2
cd boost_1_50_0
./bootstrap.sh
echo "using gcc : 4.6 : i686-w64-mingw32-g++ : <rc>i686-w64-mingw32-windres <archiver>i686-w64-mingw32-ar ;" > user-config.jam
./bjam toolset=gcc target-os=windows --address-model=32 variant=release threading=multi threadapi=win32 link=static runtime-link=static --prefix=/opt/boost_1_50_0-release-static-windows-32 --user-config=user-config.jam -j 10 --without-mpi --without-python -sNO_BZIP2=1 -sNO_ZLIB=1 --layout=tagged install
Run Code Online (Sandbox Code Playgroud)
为了在我的项目中编译文件,我使用类似的东西
i686-w64-mingw32-g++ -march=corei7 -mfpmath=sse -m32 -Wall -fmessage-length=0 -I"/opt/boost_1_50_0-release-static-windows-32/include" -std=c++0x -O3 -g0 -DNDEBUG -I"myProject/src/cpp" -c -o myProject/build/release/src/cpp/myproject.o myproject/src/cpp/myproject.cpp
Run Code Online (Sandbox Code Playgroud)
我的测试表明正则表达式运行良好,但我仍然想解决警告.
编辑
我发现可以使用bjam的cxxflags =参数添加boost编译器的其他选项.
示例:bjam cxxflags =' - fPIC'....
也许确保将与我所做的相同参数传递给项目可以解决问题(特别是与链接问题中建议的优化相关的参数).
有多种方法可以管理项目的构建.我知道这些可能性:
我们可以说其中一些(或者其他一些我不知道的吗?)总体上优于其他项目,并且在新项目中应该是首选吗?
此时我在我的项目中使用Eclipse IDE管理的构建,我考虑迁移到makefile.不知何故,我觉得它会更易于管理,但另一方面,实际上IDE的目标是使事情更易于管理.所以,我只是想做有害的工作,试图回归老式的东西?我从Java项目中获得了很好的Maven经验,但用C++强制它是个好主意(虽然我知道它可能......)?
是否可以使用c ++ 11原子操作安全地移动unique_ptr?
目前我有这样的代码
std::unique_ptr<SyncToken> DataManager::borrowSyncToken()
{
std::unique_lock<std::mutex> syncTokenLock(syncTokenMutex);
return std::move(syncToken);
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一些更优雅的方式,就像简单地声明:
std::atomic<std::unique_ptr<SyncToken>> syncToken;
Run Code Online (Sandbox Code Playgroud)
并避免使用互斥量.或者我可能根本不需要关心锁定而且std :: move已经是原子的?
经过研究,我到目前为止在我看来:
在我的项目中,我有很多枚举,需要有与枚举成员相关的其他属性和与枚举类型相关的辅助静态方法.
据我所知,这对于标准枚举类MyItem {...}是不可能的,所以对于我项目中的每个枚举类,我有一个辅助类MyItemEnum,它封装了这些辅助静态方法,并且还实例化了辅助实例本身,以便我可以访问他们的方法,以获得其他属性.
Bellow一个例子(尽可能简化,但我相信所讨论的所有功能都在那里).
MyItem.h
enum class MyItem : unsigned int {
Item1 = 1,
Item2 = 5
};
class MyItemEnum {
private:
MyItem myItem;
size_t extInfo;
MyItemEnum(const MyItem& myItem, size_t extInfo);
~MyItemEnum();
public:
static MyItemEnum Item1;
static MyItemEnum Item2;
static const MyItemEnum &get(MyItem myItem);
operator MyItem() const;
size_t getExt() const;
bool hasNext() const;
MyItem next() const;
};
Run Code Online (Sandbox Code Playgroud)
我认为意思是显而易见的,我不需要在这里提供.cpp部分...当我需要访问扩展功能时,我使用MyItem作为参数在接口和MyItemEnum中传递.
我的第一个问题是,上面的方法是否正常,或者我应该考虑一些完全不同的东西?
我的第二个问题涉及我使用constexpr尝试做的这个枚举的优化:
enum class MyItem : unsigned int {
Item1 = 1,
Item2 = 5
};
class MyItemEnum {
private:
MyItem …Run Code Online (Sandbox Code Playgroud) 在Perl 5.20中,我需要在子字符串上运行正则表达式而不将其复制到新字符串中.所以有些相当于$str[$to]C语言.
原因是它在循环中执行,如果它每次都复制字符串,那么结果代码就是O(n^2)没有复制的情况O(n).因此,如果输入2MB字符串,则无法使用.
或者,我将欢迎有关如何重写代码的建议:我需要使用查找表进行搜索和替换.
示例输入
$str: "abcde"
$tbl: {ab=>"xy", bc=>"rq", e=>"a"}
$reg: qr/ab|bc|e/
expected output: xycda
Run Code Online (Sandbox Code Playgroud)
这是我当前的代码,对于短字符串运行良好,但它不适用于大字符串:
#translate $str: if $reg match found, replace the match with a value in $tbl hash that corresponds to the match
sub internalEncode {
my ($str, $tbl, $reg) = @_;
my $res="";
my $prevTo = 0;
my $to = 0;
#the substr($str,$to) makes it slow; in C with 0 terminated strings
#I would need to write here something …Run Code Online (Sandbox Code Playgroud)