以下代码可以使用 MSVC(v19.38) 编译,但使用 GCC(13.2) 和 Clang(17.0.1) 编译失败。但旧版本的 GCC,例如 11.2,可以正常工作。
#include <type_traits>
#ifdef MY_INT
template<typename T, T V> struct my_int
{
static constexpr T value = V;
using value_type = T;
constexpr operator value_type() const noexcept { return value; }
constexpr value_type operator()() const noexcept { return value; }
};
template<auto V> using constant_int_t = my_int<decltype(V), V>;
#else
template<auto V> using constant_int_t = std::integral_constant<decltype(V), V>;
#endif
template<typename T1, typename T2>
using add_t = decltype(T1{} + T2{});
template<typename T1, typename T2>
constexpr …Run Code Online (Sandbox Code Playgroud) 我最近开始研究将levelDB集成到我的项目中的podSpec文件.(https://github.com/iljaiwas/Podspecs/blob/master/LevelDBPodSpec/0.0.1/leveldb.podspec)
但是,当我从主目标中的.mm文件引用任何C++符号时,我得到一个链接器错误,如下所示:
Undefined symbols for architecture x86_64:
"leveldb::DB::Open(leveldb::Options const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, leveldb::DB**)", referenced from:
-[IHLevelDBContext initWithPath:] in IHLevelDBContext.o
Run Code Online (Sandbox Code Playgroud)
这就是编译器调用的样子
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -L/Users/ilja/Library/Developer/Xcode/DerivedData/LevelDBTest2-aiflqgbevhxzfxbrsdamteybrbao/Build/Products/Debug -F/Users/ilja/Library/Developer/Xcode/DerivedData/LevelDBTest2-aiflqgbevhxzfxbrsdamteybrbao/Build/Products/Debug -filelist /Users/ilja/Library/Developer/Xcode/DerivedData/LevelDBTest2-aiflqgbevhxzfxbrsdamteybrbao/Build/Intermediates/LevelDBTest2.build/Debug/LevelDBTest2.build/Objects-normal/x86_64/LevelDBTest2.LinkFileList -mmacosx-version-min=10.7 -ObjC -fobjc-arc -fobjc-link-runtime -stdlib=libc++ -framework Cocoa -lPods -o /Users/ilja/Library/Developer/Xcode/DerivedData/LevelDBTest2-aiflqgbevhxzfxbrsdamteybrbao/Build/Products/Debug/LevelDBTest2.app/Contents/MacOS/LevelDBTest2
Run Code Online (Sandbox Code Playgroud)
根据我的理解,缺少:: Open调用包含在libPods.a中
nm libPods.a | grep "Open"
U __ZN7leveldb2DB4OpenERKNS_7OptionsERKSsPPS0_
000000000005e5b1 s L___func__._ZN7leveldb6DBImpl24OpenCompactionOutputFileEPNS0_15CompactionStateE
00000000000099d0 T __ZN7leveldb2DB4OpenERKNS_7OptionsERKSsPPS0_
0000000000060ba0 S __ZN7leveldb2DB4OpenERKNS_7OptionsERKSsPPS0_.eh
Run Code Online (Sandbox Code Playgroud)
我似乎可以通过将主应用程序的"编译器"设置从Apple LLVM 4.2更改为LLVM GCC 4.2来解决链接器错误,但此编译器会阻止Objective-C 2.0功能,如下所示:
expected a property attribute before 'strong'
Run Code Online (Sandbox Code Playgroud)
感谢您对我可能做错的任何指示,Ilja
我在使用来自xcode 4.6.2的clang ++在mac os x 10.8.3下使用"-std = c ++ 11 -stdlib = libc ++"编译程序时遇到问题.
当我尝试使用std :: mem_fn()或(不赞成)std :: mem_fun_ref()时,我得到链接器错误"找不到符号".相同的代码(使用std :: mem_fun_ref而不是std :: mem_fn)在c ++ 03标准下编译和链接没有任何问题.
如果我在一个对象上调用相同的成员函数而不通过mem_fn或mem_fun_ref引用它,程序将编译并运行没有任何问题.这是一个clang ++问题,一个mac os问题,还是我做错了什么?
代码:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char **arvc)
{
/* The beginning of the function compiles without any errors */
string str = "It's a test)";
if (str.empty())
{
cout << "String is empty!!!" << endl;
}
vector<string> v1;
v1.push_back("str1");
v1.push_back("str2");
v1.push_back("");
v1.push_back("str4"); …Run Code Online (Sandbox Code Playgroud) 我尝试clang++用两种方式从trunk(~3.7)构建:通过gcc(4.8)和(旧)clang++(3.4和3.5来自数据包管理器).它们都包含相同的步骤:
export CC=clang
export CXX=clang++
export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:$HOME/llvm/projects/libcxxabi/include"
sudo apt-get install git
cd
git clone --single-branch --branch master --depth=1 http://llvm.org/git/llvm
cd llvm/projects/
git clone --single-branch --branch master --depth=1 http://llvm.org/git/libcxxabi
git clone --single-branch --branch master --depth=1 http://llvm.org/git/libcxx
git clone --single-branch --branch master --depth=1 http://llvm.org/git/compiler-rt
cd ../tools
git clone --single-branch --branch master --depth=1 http://llvm.org/git/clang
git clone --single-branch --branch master --depth=1 http://llvm.org/git/clang-tools-extra extra
git clone --single-branch --branch master --depth=1 http://llvm.org/git/lld
git clone --single-branch --branch master --depth=1 http://llvm.org/git/lldb
git …Run Code Online (Sandbox Code Playgroud) 我知道g ++(和MSVC)的开关允许对operator []进行边界检查,遗憾的是,据我所知,LLVM的libc ++没有这种开关或调试代码的完整实现.
在我当前的项目中,我一直在使用我自己的vector实现(几年前我为可移植性编写),它不会抛出异常,并且对operator []和(在实际上有一个调用另一个和他们的行为完全相同,因为没有例外).
在我完成当前程序之后,我将要移交这个代码库,它可能已经使用了很长时间.因为我不应该被要求维护它或任何我宁愿在任何地方完全符合标准,我不认为重新实现容器是符合标准的精神,(我也高度怀疑我的容器与libc ++或libstdc ++团队编写的一样好.
是否有一些预处理器魔法或类似的东西,我可以做的是使operator []在调试期间表现得像((因为它因未捕获的异常而中止)并且在我禁用此调试模式时表现得像operator []?(项目完全支持C++ 14)
我正在尝试使用clang编译库.该库调用'unlink',这不是由clang定义的:
libmv/src/third_party/OpenExif/src/ExifImageFileWrite.cpp:162:17: error: use of undeclared identifier 'unlink'; did you mean 'inline'?
unlink( mTmpImageFile.c_str() ) ;
Run Code Online (Sandbox Code Playgroud)
我的问题是,取消联系的铿锵声是什么?正如我所看到的那样,前进的道路将是#define取消与某个等效例程的联系.
我无法弄清楚为什么从Objective-C文件进行此简单调用的C ++函数不起作用...如何解决该问题?
上下文菜单:
#import <Cocoa/Cocoa.h>
void showMyMenu() {
NSMenu *theMenu = [[NSMenu alloc] initWithTitle:@"Contextual Menu"];
[theMenu insertItemWithTitle:@"Beep" action:@selector(beep:) keyEquivalent:@"" atIndex:0];
[theMenu insertItemWithTitle:@"Honk" action:@selector(honk:) keyEquivalent:@"" atIndex:1];
[theMenu popUpMenuPositioningItem:nil atLocation:[NSEvent mouseLocation] inView:nil];
}
Run Code Online (Sandbox Code Playgroud)
app.h:
#ifdef __cplusplus
extern "C" {
#endif
void showMyCppMenu();
#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)
app.cpp:
#include "app.h"
void showMyMenu();
void showMyCppMenu() {
showMyMenu();
}
Run Code Online (Sandbox Code Playgroud)
main.m:
#import <Cocoa/Cocoa.h>
#include "app.h"
// void showMyMenu();
// void showMyCppMenu();
int main(int argc, const char * argv[])
{
NSApplication * application = [NSApplication sharedApplication];
// …Run Code Online (Sandbox Code Playgroud) 以下C++代码使编译器GCC(6.3.0)和Clang(3.8.0)变得疯狂.
for (auto v : vectors2d)
for_each (begin(ret), end(ret), [v[3]] (int &n) { n+= v[3];});
Run Code Online (Sandbox Code Playgroud)
虽然以下情况很好
for (auto v : vectors2d) {
auto val = v[3];
for_each (begin(ret), end(ret), [val] (int &n) { n+= val;});
}
Run Code Online (Sandbox Code Playgroud)
我知道在C++ 14中我可以做类似的事情
for (auto v : vectors2d)
for_each (begin(ret), end(ret), [val=v[3]] (int &n) { n+= val;});
Run Code Online (Sandbox Code Playgroud)
GCC中的错误是
expected identifier before '[' token
Run Code Online (Sandbox Code Playgroud)
克朗说
expected ',' or ']' in lambda capture list
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么[v[3]]出现在捕获列表中是违法的?
社区.我有这段代码在欧几里德3D空间中找到最近的一对点.这个问题既不是关于算法也不是它的实现或其他什么.问题是,它运行显著当GCC而不是锵编译慢.最令人困惑的是,它在随机样本上具有可比较的执行时间,并且在某些特定样本上具有相似的100倍.我怀疑GCC中可能存在一个错误,因为我无法想到任何其他选项.
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <queue>
#include <ctime>
#include <fstream>
#include <cassert>
#include <complex>
#include <string>
#include <cstring>
#include <chrono>
#include <random>
#include <queue>
static std::mt19937 mmtw(std::chrono::steady_clock::now().time_since_epoch().count());
int64_t rng(int64_t x, int64_t y) {
static std::uniform_int_distribution<int64_t> d;
return d(mmtw) % (y - x + 1) + x;
}
constexpr static int MAXN = 1e5 + 10;
void solve(std::istream &in, std::ostream &out);
void …Run Code Online (Sandbox Code Playgroud) 我试图建立一个CI管道与C ++一起使用。我拥有的Docker容器不支持C ++ 17,所以我想从LLVM页面下载一个发行版并正确设置。然后,我将其提取/opt/clang7。我还使用CMake工具链文件,以便它将从此clang发行版中获取include和libs等。这是我的工具链文件clang7-ci.cmake:
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_C_COMPILER /opt/clang7/bin/clang)
SET(CMAKE_CXX_COMPILER /opt/clang7/bin/clang++)
SET(CMAKE_FIND_ROOT_PATH /opt/clang7)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Run Code Online (Sandbox Code Playgroud)
我称其为CMake配置,cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/clang7-ci.cmake ..似乎是从工具链中获取了正确的clang和clang ++。正如我在CMake的配置输出中看到的那样:
-C编译器标识为Clang 7.0.1
-CXX编译器标识为Clang 7.0.1
-检查工作的C编译器:/ opt / clang7 / bin / clang
-检查工作的C编译器:/ opt / clang7 / bin / clang-工作
因此,我假设它正确使用了工具链目录,否则它将如何找到我设置的C ++编译器为clang ++。尽管如此,当我尝试使用以下命令进行构建时,它仍然给我以下错误cmake --build .:
在/builds/meguli/chops/tests/answer_life/answer_life.cpp:2包含的文件中:/builds/meguli/chops/tests/answer_life/../catch.hpp:644:10:错误:没有名为'is_same_v的模板'在命名空间'std'中;你是说'is_same'吗?
Run Code Online (Sandbox Code Playgroud)(!std::is_same_v<T, Rest> && ...) && is_unique<Rest...> ~~~~~^/usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/type_traits:1517:12:注意:此处声明为'is_same'结构is_same ^
如您所见,它将在主机目录中/usr/lib/.../inclue/6.3.0查找包含文件。这不是我想要的,我想为C ++ 17构建,我希望它包括clang发行版中的标头。我设置SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)为它将在工具链中搜索包含目录,但是它不起作用。我怎样才能让它只在下搜索/opt/clang7?